通过 preg_match_all PHP 函数从 html 代码字符串中提取 img 标签

2024-05-26

我有一些 html 代码并提取了img src来自它的属性。 html 字符串中有一些像这样的 img:

<img src="http://www.pecso.it/wp-content/uploads/2016/12/10_WRAS.png">

我尝试使用以下 PHP 代码来做到这一点:

$description = wpautop($this->data->description);
$description = preg_replace("/\[[^\]]+\]/", '', $description);
     if (preg_match_all("<img src=(.*?)>", $description, $match)) {
          echo match;
            };

结果为NULL。

你能帮我吗?


不要在 html 上使用正则表达式!

使用 dom 解析器代替,因为它更省事。

$html = file_get_contents("you_file.html");

$dom  = new \DOMDocument();
$dom->loadHTML($html);

$dom->preserveWhiteSpace = false;

$images = [];
foreach ($dom->getElementsByTagName('img') as $image) {
    $images[] = $image->getAttribute('src');
}

Edit:

您正在使用wpautop清理描述的功能。 根据文档,它需要The text to be formatted.作为第一个参数。 因此,首先确保它确实保留了参数内的图像标签。

我假设标签被保留。看看正则表达式本身,我发现它的匹配太少了。

你正在匹配.*?在捕获组内。这?表示使用惰性匹配,即根据需要匹配尽可能少的字符。 所以.*将匹配任何字符,零个或多个。和?将根据需要匹配尽可能少的数量。

在我的输出中var_dump for $match我看到它找到了匹配项。

array (size=2)   0 => 
    array (size=1)
      0 => string 'img src=' (length=8)   1 => 
    array (size=1)
      0 => string '' (length=0)

然而,由于惰性匹配,第一个匹配组的大小为 0。 我假设有内部 php 错误。它应该匹配所有内容>因为这也是正则表达式的一部分。 但 php 似乎忽略了这部分。

如果将捕获组更改为.+?,第一组将包含一个"特点。因为+这意味着“一个或多个”字符。

解决方案是更改代码,使其包含引号。

if (preg_match_all("<img src=\"(.*?)\">", $description, $match)) {

这与所需的图像链接匹配:

http://www.pecso.it/wp-content/uploads/2016/12/10_WRAS.png

我建议尝试使用 DOMDocument 方法,因为此代码更有可能更加稳定和可扩展。 如果你想学习正则表达式,解析 html 可能不是最好的开始。

所有这些代码都是使用 php 5.4 进行测试的,对于较新的版本可能会有所不同!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 preg_match_all PHP 函数从 html 代码字符串中提取 img 标签 的相关文章

随机推荐