【问题标题】:How to use preg_match() to extract specific data using PHP [duplicate]如何使用 preg_match() 使用 PHP 提取特定数据 [重复]
【发布时间】:2012-10-17 17:50:25
【问题描述】:

可能重复:
How to parse and process HTML with PHP?

问题:

仅使用 preg_match 从网页中提取第一个 并将其转储到数组中。

代码:

$str = file_get_contents('http://www.domain.com');
preg_match('#<ul class="list">(.*)</ul>#i', $str, $matches);

预期目标:

获取第一个

    并将其全部转储到一个数组中。
      应该是父元素,里面的每个元素都应该是子元素。

【问题讨论】:

    标签: php arrays string preg-match file-get-contents


    【解决方案1】:

    preg_match 是一个字符串操作函数,对“子元素”一无所知,因此永远无法返回您希望的数组。

    您需要使用能够为您解析 HTML 的库,例如 Simple HTML DOM 或内置 DOM 库的 loadHTML method

    [编辑 - 上面的“从不”有点夸大其词:您可以稍加努力,只使用preg_match 编写自己的迷你解析器,但它会不灵活并且与使用 HTML 解析库相比是不可维护的。]

    【讨论】:

      【解决方案2】:

      您想使用 .+?或者,如果有多个,您可以不只抓取第一个 ul。

      preg_match( '/<ul class="list">(.+?)<\/ul>/mis', $str, $match );
      
      preg_match_all( '/<li>(.+?)<\/li>/mis', $match[1], $lis );
      
      $answer = array ( 'ul' => $lis[1] );
      

      我想这就是你要找的东西

      【讨论】:

        【解决方案3】:
        $str = file_get_contents('http://www.domain.com');
        preg_match('~<ul class="list">(.*?)</ul>~si', $str, $matches);
        

        使用 .?匹配第一个和最接近的结束标签。如果您使用 .,它将首先在页面上找到。我认为你的 UL 标签是正确的。

        您还需要 si 标志,如 s = 单行i = 不敏感
        否则你的模式会在第一个 \n 中断。

        PS如果您的 UL 包含 UL 子项,您应该考虑使用 DOMDocumentDOMXPath 查询进行解析。对于更复杂的 HTML,它更安全。

        希望对你有所帮助。

        【讨论】:

          猜你喜欢
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-23
          • 2013-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多