正则表达式,如何找到里面不包含标签IMG的所有A标签?

时间:2010-05-24 09:58:09

标签: php regex regex-negation

我们假设我们有这样的HTML代码。我们需要获取其中不包含<a href=""></a>标记的所有img标记。

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>
<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

我正在使用此正则表达式查找所有标记链接:

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>(.*?)</a>!is", $content, $out);

我可以像这样修改它:

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>([^<>]+?)</a>!is", $content, $out);

但是如何告诉它在<img内排除包含<a href=""></a>子字符串的结果?

2 个答案:

答案 0 :(得分:3)

您需要使用像Simple DOM parser这样的HTML解析器。你cannot parse HTML with regular expressions

答案 1 :(得分:2)

Dom是要走的路,但为了感兴趣,这里有解决方案:

在正则表达式中排除某些匹配项的最简单方法是使用“负面预测”或“负面观察”。如果在字符串中的任何位置找到否定表达式,则匹配失败。

示例:

^(?!.+<img.+)<a href=\"?\'?.+\"?\'?>.+</a>$

匹配

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>

但不匹配:

<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

负面的期待是字符串的这一部分:

(?!.+<img.+)

这表示不匹配任何字符后跟&lt; img,后跟任何字符的字符串。

<a href=\"?\'?.+\"?\'?>.+</a>

其余的是html中锚标记的一般匹配,您可能想要使用替代匹配表达式。

根据您的使用情况,您可能需要省略开始和结束^ $字符。

有关前瞻/后方的更多信息

http://www.codinghorror.com/blog/2005/10/excluding-matches-with-regular-expressions.html