问题:
仅提取第一个< 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;应该是父母,里面的每个元素都应该是孩子。
答案 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] );
我认为这就是你要找的东西