-2

可能重复:
如何使用 PHP 解析和处理 HTML?

问题:

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

代码:

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

期望的目标:

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

4

3 回答 3

0

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

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

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

于 2012-10-17T18:03:06.840 回答
0
$str = file_get_contents('http://www.domain.com');
preg_match('~<ul class="list">(.*?)</ul>~si', $str, $matches);

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

您还需要si 标志,如s = single-linei = insensitive
否则,您的模式会在第一个 \n 上中断。

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

希望能帮助到你。

于 2012-10-17T18:04:24.990 回答
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] );

我想这就是你要找的

于 2012-10-17T18:05:26.170 回答