【问题标题】:extract img tag from a html code string through preg_match_all PHP function通过 preg_match_all PHP 函数从 html 代码字符串中提取 img 标签
【发布时间】:2016-12-27 14:24:11
【问题描述】:

我有一些 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。

你能帮帮我吗?

【问题讨论】:

  • 改用 Dom 解析器
  • /&lt;img src=\"(.*?)\"&gt;/
  • 你想要图片链接或完整的pecso.it/wp-content/uploads/2016/12/10_WRAS.png">这个
  • @ivan 我想获取每个 img 标签的 src
  • @federkun 能否写出调用函数的完整文本?

标签: php html preg-match-all


【解决方案1】:

不要在 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 错误。它应该与&gt; 匹配,因为这也是正则表达式的一部分。 但似乎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 测试的,新版本可能会有所不同!

【讨论】:

  • DomDocument 是处理 HTML 的正确方式。
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多