【问题标题】:Trying to replace <br>, <BR>, <br +attribute> tags with <br/>试图用 <br/> 替换 <br>、<BR>、<br +attribute> 标签
【发布时间】:2017-09-24 13:41:49
【问题描述】:

我正在尝试将一堆 HTML 文档转换为 XML 合规性(通过 java 方法),并且有很多 &lt;br&gt; 标记(1)未关闭或(2)包含属性。由于某种原因,我使用的正则表达式没有解决包含属性的标签。代码如下:

htmlString = htmlString.replaceAll("(?i)<br *>", "<br/>");

此代码适用于文档中的所有&lt;br&gt; 标签;它用&lt;br/&gt; 替换它们。但是,对于像

这样的标签
<BR style="PAGE-BREAK-BEFORE: always" clear=all>

它什么也没做。我希望所有 br 标记都为&lt;br/&gt;,无论转换前标记中的任何属性如何。

为了实现这一点,我需要向我的正则表达式添加什么?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    这个正则表达式会做你想做的事:&lt;(BR|br)[^&gt;]*&gt;

    这是一个工作示例:Regex101

    【讨论】:

      【解决方案2】:

      您可能希望&lt;br\b[^&gt;]*&gt; 匹配所有标签

      • &lt;br开头
      • &lt;br 之后有一个分词符(例如,您不会匹配&lt;brown&gt; 标记
      • 包含任意数量的非&gt; 字符,包括0
      • &gt; 结尾

      【讨论】:

        【解决方案3】:

        您必须使用.* 而不是*

        htmlString.replaceAll("(?i)<br .*>", "<br/>")
        //-----------------------------^^
        

        因为:

        * 匹配前面的字符或子表达式 0 次或多次。

        .* 匹配任意字符零次或多次

        所以对于你的情况:

        String htmlString = "<BR style=\"PAGE-BREAK-BEFORE: always\" clear=all>";
        System.out.println(htmlString.replaceAll("(?i)<br .*>", "<br/>"));
        

        输出

        <br/>
        

        【讨论】:

        • .* 不是一个好主意。该模式将如何处理&lt;br &gt;&lt;strong&gt;Lorem ipsum dolor sit amet&lt;/strong&gt;
        【解决方案4】:

        使用正则表达式解析 HTML 不是一个好主意,因为 HTML 不是正则的。您应该使用正确的解析库,例如 NekoHTML

        NekoHTML 是一个简单的 HTML 扫描器和标签平衡器,它支持 应用程序程序员解析 HTML 文档并访问 使用标准 XML 接口的信息。解析器可以扫描 HTML 文件并“修复”人类(和计算机)的许多常见错误 作者编写 HTML 文档。 NekoHTML 添加缺少的父级 元素;自动关闭带有可选结束标签的元素;和 可以处理不匹配的内联元素标签。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-16
          • 1970-01-01
          • 2014-01-24
          • 1970-01-01
          • 1970-01-01
          • 2013-06-08
          • 2015-08-15
          相关资源
          最近更新 更多