【问题标题】: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 子项,您应该考虑使用 DOMDocument 和 DOMXPath 查询进行解析。对于更复杂的 HTML,它更安全。
希望对你有所帮助。