如何在 PHP 中返回正则表达式匹配,而不是替换

问题描述 投票:0回答:2

我正在尝试在 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中的正则表达式匹配?

php preg-replace
2个回答
34
投票

你可以使用

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 字符串中提取数据时,正则表达式通常不是“正确的工具”...)


0
投票

解析可解析 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
© www.soinside.com 2019 - 2024. All rights reserved.