使用正则表达式匹配未嵌套在锚标记中的图像标记

时间:2012-11-06 04:10:54

标签: regex regex-negation

如何使用正则表达式匹配未嵌套在锚标记内的图像?

这就是我想要的:

不匹配: <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希望它具体。

2 个答案:

答案 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>)