用于查找 HTML“img”元素的所有“src”属性的正则表达式仅文件夹 PHP

Regular expression to find all “src” attribute of HTML “img” element only folder in PHP

我有一个字符串,里面有一张图片:

"<img src="img/programacao/51.jpg" style="width:200px;" /><p>balbalba</p><img src="img/programacao/46.jpg" style="width:200px;" /><p>balbalba</p><img src="/img/finalCinerio.jpg"><p>balbalba</p><img src="img/topo.jpg" />"

我只需要图片文件夹:img/programacao/

但是我的正则表达式不起作用:

preg_match_all('/<img.*?src="([^"]*)"[^>]*>(?:<img>)?/', $text, $image);

输出

...
        [0] => img/topo.jpg
        [1] => img/p_veneza.png
        [2] => img/programacao/51.jpg
        [3] => img/programacao/46.jpg
        [4] => img/p_rio.png
        [5] => /img/finalCinerio.jpg
        [6] => img/rodape.jpg

...

但只需要

...
        [0] => img/programacao/51.jpg
        [1] => img/programacao/46.jpg

...

简单易懂

 '/src=\"(?P<src>img\/programacao\/[^\"]+)\"/'

除非您有很多 iframesstyle/script 标签,否则您并不需要 img 标签。您可以添加它,但它会使可靠匹配变得非常非常困难。原因是无法保证 src 属性将显示在何处。

Regx101

大部分都非常简单,字面匹配

  • [^\"]+ = 不是引号(匹配多于一个)匹配任何不是引号的序列。我更喜欢这个然后 .*? 匹配任何非贪婪的可读性主要是
  • ?P<src> 命名为 ( ... ) 捕获组,return 与 src
  • 的字符串键匹配

我喜欢命名的捕获组,尽管在这里对于单个匹配没有那么有用。但是,它的主要目的是提高可读性,并且允许您稍后更改代码。比如添加另一个捕获组,而不用担心你的比赛号码会改变,例如。

如果你想变得很花哨

\<img.*?(?<!src=)src=(?P<quote>\"|\')(?P<src>img\/programacao\/[^\k<quote>]+)\k<quote>
  • (?<!src=) negative look behind match anything .*? (non-greedy) if not src=
  • \k<quote> 对引用捕获组的反向引用,基本上意味着引用样式 '" 必须匹配

虽然老实说,这可能有点矫枉过正。

fancy demo

您也可以为此使用 preg_match_all,但这取决于您阅读文件的方式。如果您逐行阅读,请使用 preg_match.

您可以使用解析器和简单的正则表达式来执行此操作,以检查以所需目录开头的属性...

$string = '<img src="img/programacao/51.jpg" style="width:200px;" /><p>balbalba</p><img src="img/programacao/46.jpg" style="width:200px;" /><p>balbalba</p><img src="/img/finalCinerio.jpg"><p>balbalba</p><img src="img/topo.jpg" />';
$doc = new DOMDocument();
$doc->loadHTML($string);
$images = $doc->getElementsByTagName('img');
foreach ($images as $image) {
    if(preg_match('~^img/programacao/~', $image->getAttribute('src'))) {
        echo $image->getAttribute('src') . "\n";
    }
}

输出:

img/programacao/51.jpg
img/programacao/46.jpg