繁体   English   中英

尝试更换 <br> , <BR> , <br +attribute> 标签与 <br/>

[英]Trying to replace <br>, <BR>, <br +attribute> tags with <br/>

我正在尝试将一堆HTML文档转换为XML规范(通过java方法),并且有很多<br>标记要么(1)未关闭,要么(2)包含属性。 由于某种原因,我正在使用的正则表达式无法解决包含属性的标记。 这是代码:

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

该代码对于文档中的所有<br>标记均适用。 它用<br/>代替它们。 但是,对于像

<BR style="PAGE-BREAK-BEFORE: always" clear=all>

它什么也没做。 我希望所有br标签都为<br/> ,而不管转换之前标签中的任何属性。

为了达到此目的,我需要在正则表达式中添加什么?

您可能希望<br\\b[^>]*>匹配所有符合以下条件的标签

  • <br开始
  • <br后面加上一个分词符(例如,您将不匹配<brown>标记
  • 包含任意数量的非>字符,包括0
  • >结尾

您必须使用.*而不是*

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/>

此正则表达式将执行您想要的操作: <(BR|br)[^>]*>

这是一个工作示例: Regex101

使用正则表达式解析HTML不是一个好主意,因为HTML不是正则。 您应该使用像NekoHTML这样的适当的解析库。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM