如何使用preg_match()使用PHP提取特定数据

时间:2012-10-17 17:50:26

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

  

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

问题:

仅提取第一个< ul class =" list">< / UL>从使用preg_match的网页中将其转储到数组中。

代码:

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

期望目标:

获得第一个&lt; UL&GT;并将它们全部转储到一个数组中。 &LT; UL&GT;应该是父母,里面的每个元素都应该是孩子。

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

$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子级,则应考虑使用 DOMDocument DOMXPath 查询进行解析。对于更复杂的HTML,它更安全。

希望它有所帮助。

答案 2 :(得分:0)

你想用。+?或者,如果有几个,你可能会获得的不仅仅是第一个ul。

preg_match( '/<ul class="list">(.+?)<\/ul>/mis', $str, $match );

preg_match_all( '/<li>(.+?)<\/li>/mis', $match[1], $lis );

$answer = array ( 'ul' => $lis[1] );

我认为这就是你要找的东西