【问题标题】:Replace all < and > that are NOT part of an HTML tag替换所有不属于 HTML 标记的 < 和 >
【发布时间】:2011-03-28 18:51:29
【问题描述】:

我一直在尝试使用正则表达式来替换所有 文本字符串,除非这些字符串是 HTML 标记的一部分。

例如:

var str = "<p>The <b>value</b> <i>1</i> is < <u>2</u></p>"

鉴于上面的例子,我想要一个如下所示的结果字符串:

var str = "<p>The <b>value</b> <i>1</i> is &lt; <u>2</u></p>"

【问题讨论】:

  • 阅读this,然后考虑改用HTML Agility Pack。
  • 大声笑“使用正则表达式解析 HTML 会将受污染的灵魂召唤到生活的领域。”

标签: .net html regex


【解决方案1】:

这并不容易。查看相关问题的权威答案here

正则表达式不是为这种类型的解析而构建的。即使是标记化或 dom 解析也会导致问题。您问题的标题说明了问题:

Replace all &lt; and &gt; that are NOT part of an HTML tag

您的解析器如何知道&lt; and &gt;&lt;AND&gt; 标记,还是只是单词and 周围的两个孤立尖括号?

HTML 解析器可能是您最好的选择,但如何处理孤括号是关键。此外,您还需要寻找不匹配的标签或非法标签来捕捉问题的标题等案例。

【讨论】:

    【解决方案2】:

    众所周知,使用正则表达式难以解析 HTML。 HTML 规范非常宽容,而浏览器实现往往更加宽容。这样做的结果是,尝试单独使用正则表达式来匹配这样的东西几乎是不可能的。

    使用能够理解所有特殊情况的成熟 HTML 解析器生成 DOM,然后在代码中遍历生成的 DOM 以查找尖括号,这会更加健壮。

    由于您已使用 .NET 标记您的问题,我可以推荐 HTML Agility Pack 来执行此类任务。

    【讨论】:

      【解决方案3】:

      关于如何检测是否存在于 HTML 标记中的文本已经提出了几个问题;您应该能够根据自己的需要修改概念。

      基本上,您要查找的 &amp;lt; 后面没有 &gt;,并且您希望将其替换为与符号形式的 &amp;lt;。尝试类似:

      var output = Regex.Replace(input, "<(?!.*?[>])", "&lt;");
      

      【讨论】:

      • 字符串&lt;img src="lessthan.jpg" alt="&lt;"&gt;会发生什么?
      • 这将匹配上面示例中的每个&amp;lt;;事实上,它将匹配整个字符串中的每个&amp;lt; 直到最后一个&gt;。这正是使正则表达式成为 HTML/XML 的错误工具的任务。
      猜你喜欢
      • 2014-06-03
      • 2018-11-23
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多