【问题标题】:regex: match string only if not part of a tag正则表达式:仅当不是标签的一部分时才匹配字符串
【发布时间】:2009-09-02 08:38:49
【问题描述】:

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

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

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    我真的不会使用正则表达式来匹配 HTML,因为 HTML 不是常规的,并且有很多边缘情况会让你感到困惑。对于除了 最简单 的所有情况,我会使用 HTML 解析器(例如,this one 用于 PHP)。

    【讨论】:

    • 你是对的 - 我从来没有找到一个好的 HTML 解析器。但是你链接到的那个就像一个魅力!谢谢。还要感谢 nicerobot 和 vinzz 的正则表达式
    【解决方案2】:

    无论如何,Brian 说得有道理,如果您想使用正则表达式,那就适合您的输入:

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

    【讨论】:

    • 错过“abc

      ”和“

      abc”。

    • 但是...但它不在输入中!这完全不公平;o)
    【解决方案3】:

    我非常确信任何正则表达式都会在某些 CDATA 部分上中断。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-10-06
          • 2014-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-16
          • 1970-01-01
          • 2012-11-25
          相关资源
          最近更新 更多