0

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

这是我想要的:

没有匹配: <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 希望它是特定的。

4

2 回答 2

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"/>
于 2012-11-06T04:53:52.933 回答
-1

<img[^>]*>(?![^<]*</a>)

于 2012-11-06T07:14:39.113 回答