如何在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】:或者,如果您的意图是显示用户控制的输入返回给客户端,那么您也可以将所有&lt;
替换为&lt;
并将所有&gt;
替换为&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标签[重复]的主要内容,如果未能解决你的问题,请参考以下文章