使用 preg_match_all 从字符串中提取 img src

Posted

技术标签:

【中文标题】使用 preg_match_all 从字符串中提取 img src【英文标题】:Extract img src from string with preg_match_all 【发布时间】:2013-02-25 19:00:33 【问题描述】:

我已经尝试使用preg_match_all 30 分钟,但看起来我做不到。

基本上我有一个$var,其中包含一串 html 代码。例如:

<br>iihfuhuf
<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"   
 src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg">
<img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>

我想获取img 标记的src 属性值,这些标记的src 值中包含/temp/temp[a-z0-9]13\.jpeg

这是我目前所拥有的:

preg_match_all('!(<img.*src=".*/temp/temp[a-z0-9]13\.jpeg"(.*)?>)!', $content, $matches);

【问题讨论】:

你尝试了 30 分钟......你想出了什么,什么没用? preg_match_all('!!', $content, $matches);我只是不太明白 preg_match_all 是如何工作的。我可以制作模式,但不能让 preg_match_all 像我期望的那样工作。 @MarcDupuis 您应该为此使用 DOM 和 XPath,而不是(仅)正则表达式。将 HTML 加载到 &lt;img&gt; 标记的 &lt;img&gt; 和 XPath 中,其中 src 包含 /temp/temp,您可以轻松地迭代匹配的节点并使用正则表达式来提取您需要的数据。您甚至可以使用 XPath 注册 php 函数,以便直接在 XPath 查询中使用您的正则表达式。 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php.html。 感谢您的建议,但代码是从所见即所得编辑器生成的,我只需要在将图像保存到数据库之前替换图像的 src。所以代码将永远是我所期望的。不过,感谢您让我了解 DOMDocument。 【参考方案1】:
<img[^>]*src="([^"]*/temp/temp[a-z0-9]13\.jpeg)"

&lt;img[^&gt;]*选择IMG标签

src="([^"]*)" 获取 src 值并保存为匹配项

/temp/temp[a-z0-9]13\.jpeg 是 src 值的过滤器

为了快速进行 RegEx 测试,请使用一些在线工具,例如 http://regexpal.com/

【讨论】:

你应该转义点\. 你也应该转义 src="([^"]*)" 中的第二个 "【参考方案2】:

您需要做的就是在您的正则表达式中添加另一个组。你已经用大括号包围了你想从匹配中提取的所有内容:

preg_match_all('!(<img.*src="(.*/temp/temp[a-z0-9]13\.jpeg)"(.*)?>)!', $content, $matches);

您可以看到 here 正在工作。您可以在$matches[2] 中找到这些 URL。

但我已经说过了:正则表达式不是从 HTML 中提取任何内容的合理方法。您最好使用 DOMDocument、XPath 或类似的东西。

【讨论】:

【参考方案3】:

这是一个基于DOMDocument/DOMXPath 的示例,说明如何执行此操作。这可以说是唯一正确的方法,因为除非你真的擅长正则表达式,否则很可能总会出现会破坏你的逻辑的极端情况。

$doc = new DOMDocument;
$xpath = new DOMXPath($doc);

$doc->loadHTML($content);

$candidates = $xpath->query("//img[contains(@src, '/temp/temp')]");

$result = array();
foreach ($candidates as $image) 
  $src = $image->getAttribute('src');
  if (preg_match('/temp[0-9a-z]13\.jpeg$/', $src, $matches)) 
    $result[] = $src;
  


print_r($result);

【讨论】:

【参考方案4】:

试试这个:

preg_match_all('/src="([^"]+temp[a-z0-9]13\.jpeg)"/',$url,$matches);

var_dump($matches);

【讨论】:

【参考方案5】:
<?php
$text = '<br>iihfuhuf<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"><img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>';
$pattern = '#src="([^"]+/temp/temp[a-z0-9]13\.jpeg)"#';
preg_match_all($pattern, $text, $out);
echo '<pre>';
print_r($out);
?>

Array
(
    [0] => Array
        (
            [0] => src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"
            [1] => src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"
        )

    [1] => Array
        (
            [0] => http://www.jlnv2.local/temp/temp513caca536fcd.jpeg
            [1] => http://www.jlnv2.local/temp/temp513caca73b8da.jpeg
        )

)

【讨论】:

【参考方案6】:
$text = '<br>iihfuhuf<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"><img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>';
$pattern = '#src="([^"]+/temp/temp[a-z0-9]13\.jpeg)"#';
    
preg_match( '@src="([^"]+)"@' , $text, $match );
$src = array_pop($match);

echo $src;

【讨论】:

以上是关于使用 preg_match_all 从字符串中提取 img src的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则提取中文字符

从字符串中获取电子邮件 - 正则表达式语法 + preg_match_all [关闭]

PHP - preg_match_all 没有搜索完整的字符串?

突出显示 preg_match_all() 的主题字符串中的匹配结果

使用 PHP 从图像中提取 alt 和/或 title 属性

preg_match提取中文的乱码问题探索