正则表达式:仅当不是标记的一部分时才匹配字符串

时间:2009-09-02 08:38:49

标签: php regex preg-replace preg-match domparser

我正在尝试匹配字符串,只要它不是html标记的一部分。

例如,在搜索字符串时:“abc”。 <a href="foo.html">abc def</a>应匹配 <p> foo bar foo abc foo bar</p>应匹配

<a href="abc.html">foo</a>不应该匹配。

感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

我真的不会使用正则表达式来匹配HTML,因为HTML不是常规的,并且有大量的边缘情况可以帮助你解决问题。对于除最简单之外的所有情况,我都使用HTML解析器(例如PHP的this one)。

答案 1 :(得分:0)

无论如何,Brian有一个观点,如果你想使用一个适合你输入的正则表达式:

.*>[^<]*abc[^<]*<.*

答案 2 :(得分:0)

我相信任何正则表达式都会在某些CDATA部分打破。

答案 3 :(得分:0)

虽然我也同意Briancomment,但我经常使用正则表达式进行快速和脏的解析,对于你的情况,我会使用类似的东西:

  • “序列化”数据
s/[\r\n]//
s/<!\[CDATA\[.*?]]>//
s/</\n</
s/>/>\n/
  • 然后只需过滤所有以<
  • 开头的行
s/^<.*//

你留下的只是文字(可能还有很多白空间)。虽然这不是关于正则表达式,而是关于搜索和替换的更多内容。

答案 4 :(得分:0)

您正在寻找的是DOM解析器。这将删除所有HTML,并为您提供您正在检查的页面的纯文本,然后您可以匹配。不确定你的用例是什么,但我不是假设你没有操纵DOM,否则你就是在使用JavaScript。

如果您只是提取信息,请使用The Simple HTML DOM Parser之类的内容解析页面,然后匹配您可以从解析对象中获取的纯文本。