用于查找 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\/[^\"]+)\"/'
除非您有很多 iframes
或 style/script
标签,否则您并不需要 img
标签。您可以添加它,但它会使可靠匹配变得非常非常困难。原因是无法保证 src
属性将显示在何处。
大部分都非常简单,字面匹配
[^\"]+
= 不是引号(匹配多于一个)匹配任何不是引号的序列。我更喜欢这个然后 .*?
匹配任何非贪婪的可读性主要是
?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>
对引用捕获组的反向引用,基本上意味着引用样式 '
与 "
必须匹配
虽然老实说,这可能有点矫枉过正。
您也可以为此使用 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
我有一个字符串,里面有一张图片:
"<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\/[^\"]+)\"/'
除非您有很多 iframes
或 style/script
标签,否则您并不需要 img
标签。您可以添加它,但它会使可靠匹配变得非常非常困难。原因是无法保证 src
属性将显示在何处。
大部分都非常简单,字面匹配
[^\"]+
= 不是引号(匹配多于一个)匹配任何不是引号的序列。我更喜欢这个然后.*?
匹配任何非贪婪的可读性主要是?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 notsrc=
\k<quote>
对引用捕获组的反向引用,基本上意味着引用样式'
与"
必须匹配
虽然老实说,这可能有点矫枉过正。
您也可以为此使用 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