如何使用正则表达式匹配未嵌套在锚标记内的图像?
这就是我想要的:
不匹配: <a href="index.html"><img src="images/default.jpg" /></a>
匹配: <div><img src="images/default.jpg" /></div>
匹配: <img src="images/default.jpg" />
我不擅长正则表达式,但这是我到目前为止所做的,但这不起作用:
[^<a[^>]*>]<img.*?/>[^</a>]
我无法使用外观,因为PHP希望它具体。
答案 0 :(得分:2)
您遇到困难的主要原因很简单,HTML不是常规语言,请参阅:Coding Horror: Parsing Html the Cthulhu Way
考虑使用足够强大的查询表达式语言来处理(X)HTML,或者只是以编程方式使用DOM来获取所有图像标记,然后排除<a>
祖先的那些。
在PHP5中,我相信您可以使用DOMXPath
,使用它变得如此简单:
$generated_string = '<a href="index.html"><img src="images/inside_a.jpg" /></a>' .
'<div><img src="images/inside_div.jpg" /></div>' .
'<img src="images/inside_nothing.jpg" />';
$doc = new DOMDocument();
$doc->loadHTML($generated_string);
$xpath = new DOMXpath($doc);
$elements = $xpath->query("//*[not(self::a)]/img");
foreach ($elements as $element){
echo $doc->saveXML($element) . "\n";
}
此代码将提供输出:
<img src="images/inside_div.jpg"/>
<img src="images/inside_nothing.jpg"/>
答案 1 :(得分:-1)
<img[^>]*>(?![^<]*</a>)