如何在Java中删除HTML标签[重复]

Posted

技术标签:

【中文标题】如何在Java中删除HTML标签[重复]【英文标题】:How to remove HTML tag in Java [duplicate] 【发布时间】:2010-12-14 12:48:24 【问题描述】:

有没有可以完全去除html标签的正则表达式? 顺便说一句,我正在使用 Java。

【问题讨论】:

在搜索框中输入您的标题,我得到以下信息:***.com/search?q=How+to+remove+HTML+tag+in+Java ...您在发布问题时没有得到相同的结果吗? 我没有发现重复项。这些问题关心从 HTML 中提取文本:***.com/questions/240546/…***.com/questions/832620/stripping-html-tags-in-java 【参考方案1】:

没有。正则表达式不能根据定义解析 HTML。

您可以对s/<[^>]*\>// 使用正则表达式或类似的简单方法,但这将是不够的,尤其是如果您有兴趣删除标签的内容。

正如另一位发帖者所说,使用实际的 HTML 解析器。

【讨论】:

【参考方案2】:

您不需要任何 HTML 解析器。下面的代码删除了所有的 HTML cmets:

htmlString = htmlString.replaceAll("(?s)<!--.*?-->", "");

【讨论】:

【参考方案3】:

JSoup 是一个用于 HTML 操作的 java 库。查看clean() 方法和WhiteList 对象。易于使用的解决方案!

【讨论】:

哇,先生,真的让我很开心,我喜欢这样,是的! Markdownj、Markdown4J、htmlCleaner .. 所有这些都是 ***** 抱歉.. JSoup 是唯一一个你真正实现这一目标的地方:String plain = new HtmlToPlainText().getPlainText(Jsoup.parse( html)); 更短的代码是String plaintext = Jsoup.parse(html).text(); @jrarama - 一点也不。 Jsoup.parse(html).text() 删除所有标签和空格,只留下一长行文本,而 new HtmlToPlainText().getPlainText(Jsoup.parse(html)) 以简单的方式格式化文本,保留换行符、段落、项目符号等。 @isapir: HtmlToPlainText 不包含在mvnrepository.com/artifact/org.jsoup/jsoup/1.11.3 那是因为HtmlToPlainText就是一个例子,见github.com/jhy/jsoup/blob/master/src/main/java/org/jsoup/…【参考方案4】:

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

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

【讨论】:

这只会删除开始标签,而不处理结束标签。 我永远不会独自完成这样的工作 - 将 html 解析为纯文本确实是一项艰巨的工作...... 它对我有用,但可能取决于标签、cmets、脚本等的复杂性。因此,对于复杂的情况,也许 html 库应该更好。【参考方案5】:

或者,如果您的意图是显示用户控制的输入返回给客户端,那么您也可以将所有&amp;lt; 替换为&amp;lt; 并将所有&amp;gt; 替换为&amp;gt; .这样,客户端的应用程序(网络浏览器)就不会按原样解释 HTML。

如果您使用 JSP 作为视图技术,那么您可以为此使用 JSTL 的c:out。默认情况下,它将转义所有 HTML 实体。比如

<c:out value="<script>alert('XSS');</script>" />

不会显示警报,而是按原样显示实际字符串。

【讨论】:

【参考方案6】:

如果你只需要删除标签,那么你可以使用这个正则表达式:

content = content.replaceAll("<[^>]+>", "");

它只会删除标签,但不会删除其他 HTML 内容。对于更复杂的事情,您应该使用解析器。

编辑:为避免 HTML cmets 出现问题,您可以执行以下操作:

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

【讨论】:

由于您不使用任何肉类字符 .^$,因此可以省略 s- 和 m 标志。 如果 HTML 包含嵌入了 '' 字符的 XML cmets,此正则表达式可能会导致损坏。【参考方案7】:

您应该改用 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 :) 我们是否需要获取任何库才能使用上面的代码?和 root.evaluateXPath("//div[id='something']");在这个“某事”中可能是任何身份仪式吗?请告诉我。谢谢

以上是关于如何在Java中删除HTML标签[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 html 中删除特定标签 [重复]

如何从字符串中删除所有html标签[重复]

如何使用c#从文本中删除html标签[重复]

如何在 C# 中去除 html 标签 [重复]

如何在python中删除html标签中的文本? [复制]

删除图像标签 HTML/CSS 之间的水平间隙 [重复]