【问题标题】:Regex to match all HTML tags and tag content except <p> and </p>正则表达式匹配除 <p> 和 </p> 之外的所有 HTML 标记和标记内容
【发布时间】:2009-03-20 20:19:45
【问题描述】:

我正在寻找一个匹配所有 HTML 标签的正则表达式,除了包含标签内容的 &lt;p&gt;&lt;/p&gt;。我正在使用 ColdFusion 进行开发。

除了&lt;p&gt;&lt;/p&gt; 之外,还有一个关于匹配标签的earlier post,但我还需要抓取标签之间的所有内容。例如,以下内容应完全匹配:

<a href="http://www.google.com">Google</a>

<em>Some text here</em>

但不是

<p>Some text and tags here</p>

关于如何实现这一点的任何想法?

【问题讨论】:

  • 你想如何处理

    Some text here

    这里有其他文字

    ?等等。

标签: regex coldfusion


【解决方案1】:

使用正则表达式解析 HTML 非常困难和痛苦。

您最好使用某种基于 DOM 的解析器并找到您需要的元素。

【讨论】:

  • +1。正则表达式无法解析 HTML,正如已经发布的 2000 个问题中已经提到的那样,询问使用正则表达式解析 HTML。
  • 很好。最终,每一次谷歌点击“解析 html 正则表达式”都会指向其中一个问题,谈论为什么这是一个坏主意。
【解决方案2】:

有时将正则表达式与一些额外的检查结合起来会更容易。

所以\&lt;.*?\&gt;.*?\&lt;\/.*?\&gt; 应该匹配&lt;..&gt;...&lt;/..&gt; 之间的任何类似标签。然后,您可以以编程方式检查 &lt;..&gt;&lt;/...&gt; 是否分别不是 &lt;p&gt;&lt;/p&gt;。如果您将它们分组,可能最容易检查这一点:

(\<.*?\>).*?(\<\/.*?\>)

然后检查以确保 $1$2(或者您在环境中进行反向引用)不是段落打开和关闭标记。

.*? 指定最小匹配;我假设您的正则表达式环境支持这一点。

【讨论】:

    【解决方案3】:

    你还没有说你想要做什么,但是有一个很好的改变,你最好使用XmlParse 函数来创建一个 XML DOM,然后改用它。

    【讨论】:

      【解决方案4】:

      这行得通吗?我只对其进行了一些检查,但似乎:

      Regex expr = new Regex(@"<([A-OQ-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>", RegexOptions.IgnoreCase);
      

      我刚刚复制并粘贴了 C# 代码。要获取标签之间的所有内容,您需要使用 \1,然后您需要关闭区分大小写,因此 IgnoreCase 或 -i 或您使用的任何工具都提供了该选项。如果您的工具不这样做,那么您将不得不做 A-Oa-oq-zQ-z 等。只是正则表达式:

      <([A-OQ-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>
      

      请注意,这会记录匹配独立标签,但应该可以帮助您入门。

      【讨论】:

        猜你喜欢
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多