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

Jar*_*son 11 php preg-replace

我试图在HTML文本块中提取图像的第一个src属性,如下所示:

Lorem ipsum <img src="http://example.com/img.jpg" />consequat.
Run Code Online (Sandbox Code Playgroud)

我创建正则表达式以匹配src属性没有问题,但是如何返回第一个匹配的src属性,而不是替换它?

从倾注PHP手册开始,似乎preg_filter()可以解决问题,但我不能依赖于PHP> 5.3的最终用户.

所有其他PHP正则表达式函数似乎都是preg_match()的变体,返回一个布尔值,或preg_replace,它用某些东西替换匹配.有没有一种直接的方法来返回 PHP中的正则表达式匹配?

Pas*_*TIN 26

您可以使用第三个参数preg_match,以了解匹配的内容(它是一个数组,通过引用传递):

int preg_match  ( string $pattern  , 
    string $subject  [, array &$matches  [, 
    int $flags  [, int $offset  ]]] )
Run Code Online (Sandbox Code Playgroud)

如果提供了匹配,那么它将填充搜索结果. $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);
}
Run Code Online (Sandbox Code Playgroud)

你会得到这个输出:

array
  0 => string '<img src="http://example.com/img.jpg" />' (length=37)
  1 => string 'http://example.com/img.jpg' (length=23)
Run Code Online (Sandbox Code Playgroud)

(请注意,我的正则表达式过于简单 - 当从一些HTML字符串中提取数据时,正则表达式通常不是"正确的工具"...)