我有一个字符串,里面有一个图像:
"<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/[^"]+)"/'
你并不真的需要img
标签,除非你有很多iframes
或style/script
标签。你可以把它加进去,但这会让可靠的匹配变得更加困难。原因是无法保证src
属性将显示在哪里。
Regx101
大部分都很简单,文字匹配
-
[^"]+
= Not a quote(匹配多个)匹配任何非引号的序列。我更喜欢这个,然后.*?
匹配任何不贪婪的可读性,主要是 -
?P<src>
命名( ... )
捕获组,返回匹配src
字符串键
我喜欢命名捕获组,尽管在这里对单个匹配没有那么有用。然而,它的主要目的是可读性,并且允许您稍后更改代码。例如,添加另一个捕获组,而不用担心匹配号在您身上发生变化。
如果你想更花哨一点
<img.*?(?<!src=)src=(?P<quote>"|')(?P<src>img/programacao/[^k<quote>]+)k<quote>
-
(?<!src=)
负查看后面匹配.*?
(非贪婪)如果不是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