我正在尝试在 HTML 文本块中提取图像的第一个 src 属性,如下所示:
Lorem ipsum <img src="http://example.com/img.jpg" />consequat.
创建正则表达式来匹配 src 属性没有问题,但是如何返回第一个匹配的 src 属性,而不是替换它?
从 PHP 手册来看,似乎 preg_filter() 可以解决问题,但我不能依赖最终用户拥有高于 5.3 的 PHP 版本。
所有其他 PHP 正则表达式函数似乎都是 preg_match()(返回布尔值)或 preg_replace(用某些内容替换匹配项)的变体。有没有一种直接的方法来返回PHP中的正则表达式匹配?
preg_match
的第三个参数来知道匹配了什么(它是一个数组,通过引用传递):
int preg_match ( string $pattern ,
string $subject [, array &$matches [,
int $flags [, int $offset ]]] )
如果提供了匹配项,则为 充满搜索结果。
将包含以下文本 匹配完整图案,$matches[0]
将有匹配的文本 第一个捕获的括号 子模式等等。$matches[1]
例如,这部分代码:
$str = 'Lorem ipsum dolor sit amet, adipisicing <img src="http://example.com/img.jpg" />consequat.';
$matches = array();
if (preg_match('#<img src="(.*?)" />#', $str, $matches)) {
var_dump($matches);
}
您将得到以下输出:
array
0 => string '<img src="http://example.com/img.jpg" />' (length=37)
1 => string 'http://example.com/img.jpg' (length=23)
(请注意,我的正则表达式过于简单化——当涉及到从某些 HTML 字符串中提取数据时,正则表达式通常不是“正确的工具”...)
解析可解析 HTML 文本的“正确工具”是 DOM 解析器。我推荐 DOMDocument 及其强大的盟友 XPath。
通过使用
evaluate()
(而不是 query()
)搜索具有 src 属性的第一个 img 标签,您可以在路径周围使用 string()
直接以字符串值形式调用结果。
这比正则表达式更直观、更可靠。对于正则表达式来说,为了避免引用差异并排除像
data-src
这样的属性,模式需要增长(更丑)。
代码:(演示)
$dom = new DOMDocument;
$dom->loadHTML($str);
echo (new DOMXPath($dom))->evaluate('string(//img/@src)');
结果:
http://example.com/img.jpg