【问题标题】:Regular expression to find all “src” attribute of HTML “img” element only folder in PHP正则表达式在PHP中查找HTML“img”元素的所有“src”属性仅文件夹
【发布时间】:2015-11-08 07:21:20
【问题描述】:

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

"<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

...

【问题讨论】:

  • 然后只需preg_grep() 所需子集的结果列表。 (否则为“您的”原始正则表达式添加前瞻。)
  • 为什么不直接使用 html 解析器?

标签: php html regex html-parsing preg-match-all


【解决方案1】:

简单易懂

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

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

Regx101

大部分都是非常简单的文字匹配

  • [^\"]+ = Not a quote ( match more than one ) 匹配任何不是引号的序列。我更喜欢这个然后.*? 匹配任何不贪婪的可读性大部分
  • ?P&lt;src&gt; 命名为( ... ) 捕获组,返回匹配字符串键为src

我喜欢命名的捕获组,尽管在单场比赛中没有那么有用。但是,它的主要目的是可读性,它允许您稍后更改代码。例如添加另一个捕获组,而不必担心匹配数会在您身上发生变化。

如果你想变得很花哨

\<img.*?(?<!src=)src=(?P<quote>\"|\')(?P<src>img\/programacao\/[^\k<quote>]+)\k<quote>
  • (?&lt;!src=) 否定看后面匹配任何东西 .*?(非贪婪)如果不是 src=
  • \k&lt;quote&gt;后面引用引用捕获组,基本意思是引用样式' vs "必须匹配

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

fancy demo

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

【讨论】:

  • OP 只想要在img/programacao/ 中的图像
  • @iismathwizard 是的,有一些小细节,但我使用了一个命名的捕获组,所以一切都很好。
  • @iismathwizard 你知道,你宁愿添加一个解释而不是用一个正则表达式演示链接代替它。
【解决方案2】:

您可以使用解析器和简单的正则表达式来检查属性是否以所需目录开头...

$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

【讨论】:

  • 我非常同意让自己熟悉适当的 DOM 操作工具,例如示例中所示的工具。
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多