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

标签 php html preg-match-all

我有一些 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');
}

编辑:

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

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

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

在我为 $match 输出的 var_dump 中,我看到它找到了一个匹配项。

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 测试的,对于较新的版本可能会有所不同!

关于php - 通过 preg_match_all PHP 函数从 html 代码字符串中提取 img 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346921/

相关文章:

PHP:在逗号上拆分字符串,但在大括号或引号之间不拆分?

php - 使用 Codeigniter 登录问题

php - 如何对文件和目录列表进行排序,使目录在 PHP 中首先列出

php - Wordpress php while循环按id返回页面

javascript - 在给定时间范围内显示不同的图像

php - 消息表单不起作用

php - 在 WHERE 子句中正确使用数组值

php - 使用 php 从 Joomla 文章中获取图像

PHP表警告: Invalid argument supplied for foreach

html - 如何修复我的 div,使其在重新缩放图像时向上移动