我们假设我们有这样的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>
子字符串的结果?
答案 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