如何在Java中删除HTML标签

15

有没有一个能完全删除 HTML 标签的正则表达式呢?顺便说一下,我正在使用 Java。


2
在搜索框中键入您的标题,我得到了以下结果:http://stackoverflow.com/search?q=How+to+remove+HTML+tag+in+Java...您在发布问题时没有得到相同的结果吗? - kdgregory
2
我没有发现重复。这些问题关于从HTML中提取文本:https://dev59.com/UXVC5IYBdhLWcg3wnCaA https://dev59.com/EXRA5IYBdhLWcg3wxA9N - tangens
6个回答

24

有一个针对HTML操作的Java库叫做JSoup。看一下clean()方法和WhiteList对象。这是一个易于使用的解决方案!


2
哇,您真的让我开心,我喜欢这个!Markdownj、Markdown4J、htmlCleaner...它们都不太好用。JSoup是唯一一个可以用一行代码实现的: String plain = new HtmlToPlainText().getPlainText(Jsoup.parse(html)); - jebbie
4
更短的代码可以是String plaintext = Jsoup.parse(html).text();,此行代码的作用是将HTML字符串解析并转换为纯文本形式。 - jrarama
3
@jrarama - 绝对不是这样。Jsoup.parse(html).text() 删除了所有标签和空格,只留下一个长长的单行文本,而new HtmlToPlainText().getPlainText(Jsoup.parse(html)) 以简单的方式格式化文本,保留换行符、段落、项目符号等。 - isapir
@isapir:HtmlToPlainText未包含在https://mvnrepository.com/artifact/org.jsoup/jsoup/1.11.3中。 - Marco Sulla
这是因为HtmlToPlainText是一个示例,可以参见https://github.com/jhy/jsoup/blob/master/src/main/java/org/jsoup/examples/HtmlToPlainText.java。 - ChrLipp

20

你应该使用一个HTML解析器。我喜欢 htmlCleaner,因为它可以给我一个格式化后的HTML版本。

通过使用htmlCleaner,你可以做到:

TagNode root = htmlCleaner.clean( stream );
Object[] found = root.evaluateXPath( "//div[id='something']" );
if( found.length > 0 && found instanceof TagNode ) {
    ((TagNode)found[0]).removeFromTree();
}

谢谢你指引我使用htmlCleaner :) - exhuma
我们需要获取任何库来使用上面的代码吗?而在 root.evaluateXPath("//div[id='something']"); 中,"something" 可以是任何 id,对吗?请告诉我。谢谢。 - Geet taunk

6
如果您只需要删除标记,则可以使用此正则表达式:
content = content.replaceAll("<[^>]+>", "");

这将仅移除标签,但不会移除其他HTML内容。对于更复杂的内容,您应该使用解析器。

编辑:为避免HTML注释问题,您可以采取以下措施:

content = content.replaceAll("<!--.*?-->", "").replaceAll("<[^>]+>", "");

由于您没有使用任何肉类字符“。”,“^”和“$”,因此可以省略sm标志。 - Bart Kiers
如果HTML包含带有嵌入的'<'或'>'字符的XML注释,这个正则表达式可能会导致混乱。 - Stephen C

4

不,根据定义,正则表达式无法解析HTML。

你可以使用正则表达式s/<[^>]*\>//或类似的简单方法,但这将是不够完善的,特别是如果你想要删除标签的内容。

正如另一个帖子所说,使用实际的HTML解析器。


2
你不需要任何HTML解析器。下面的代码将删除所有HTML注释: htmlString = htmlString.replaceAll("(?s)<!--.*?-->", "");

0

您可以使用这个简单的代码来删除所有的HTML标签...

htmlString.replaceAll("\\<.*?\\>", ""))

1
这将仅删除开放标签并保留未处理的关闭标签。 - jlordo
我从不会独自完成那样的工作 - 将HTML解析为纯文本真的是一项非常困难的工作,伙计.. - jebbie
它对我有效,但可能取决于标签、注释、脚本等的复杂性。因此,对于复杂情况,可能更好的选择是使用一个HTML库。 - jmoran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接