用Java剥离HTML标签

是否有一个现有的Java库提供了一个方法来从string中去掉所有的HTML标签? 我正在寻找相当于PHP中strip_tags函数的东西。

我知道我可以使用这个Stackoverflow问题中描述的正则expression式,但是我很好奇,如果可能已经有一个stripTags()方法在Apache Commons库中的某处可以使用。

使用JSoup ,这是很好的文档,在Maven上可用,经过一天的时间与几个图书馆,这是我可以想象的最好的。我自己的意见是,这样的工作,parsingHTML到纯文本,文本,应该是可能的在一行代码 – >否则图书馆失败以某种方式…只是说^^所以在这里,它是JSoup的单行 – 在Markdown4J,类似的东西是不可能的,在Markdownj ,在htmlCleaner这是痛苦的屁股约50行代码…

 String plain = new HtmlToPlainText().getPlainText(Jsoup.parse(html)); 

而你得到的是真正的纯文本(不仅仅是HTML源代码作为一个string,就像在其他库中大声笑) – >他真的在这方面做得很好。 它与Markdownify for PHP的质量差不多。

这是我在谷歌上find的。 对我来说,它工作得很好。

 String noHTMLString = htmlString.replaceAll("\\<.*?\\>", ""); 

不pipe你做什么,在开始试图剥离标签之前,确保你的数据正常化。 我最近参加了一个networking应用程序安全研讨会,涵盖了XSS过滤规避行为。 人们通常会认为search<&lt; 或者它的hex等价就足够了。 看到有70种方式的幻灯片后,我被吹走了, <可编码击败filter。

更新:

下面是我所指的演示文稿,请参见幻灯片26中的70种编码方式<

过滤回避:Houdini在电线上

可能有一些,但最强大的是使用一个实际的HTMLparsing器。 这里有一个,如果格式合理,你也可以使用SAX或其他XMLparsing器。

在将这个问题打开了近一个星期之后,我可以肯定地说,在Java API或Apache libaries中没有可以从String中去除HTML标记的方法。 您将不得不像前面的答案中所描述的那样使用HTMLparsing器,或者编写一个简单的正则expression式来去除标签。

我用nekoHtml来做到这一点。 它可以去除所有的标签,但是也可以轻松地保留或去除一部分标签。

在使用Jsoup时比上面的回答更容易:

 String html = "bla <b>hehe</b> <br> this is awesome simple"; String text = Jsoup.parse(html).text(); 

我知道这个问题是相当古老的,但我也一直在寻找这个,似乎在java中find一个好的和简单的解决scheme仍然是不容易的。

今天我遇到了这个小函数库。 它实际上是试图模仿php strip_tags函数。

http://jmelo.lyncode.com/java-strip_tags-php-function/

它像这样工作(从他们的网站复制):

  import static com.lyncode.jtwig.functions.util.HtmlUtils.stripTags; public class StripTagsExample { public static void main(String... args) { String result = stripTags("<!-- <a href='test'></a>--><a>Test</a>", ""); // Produced result: Test } } 

嗨,我知道这个线程是旧的,但它仍然出现在谷歌上,我正在寻找一个快速解决同样的问题。 找不到任何有用的东西,所以我想出了这个代码片段 – 希望它可以帮助别人。 它只是在string上循环,并跳过所有的标签。 简单和简单。

 boolean intag = false; String inp = "<H1>Some <b>HTML</b> <span style=blablabla>text</span>"; String outp = ""; for (int i=0; i < inp.length(); ++i) { if (!intag && inp.charAt(i) == '<') { intag = true; continue; } if (intag && inp.charAt(i) == '>') { intag = false; continue; } if (!intag) { outp = outp + inp.charAt(i); } } return outp; 

用纯迭代的方法,没有正则expression式:

 public String stripTags(final String html) { final StringBuilder sbText = new StringBuilder(); final StringBuilder sbHtml = new StringBuilder(); boolean isText = true; for (char ch : html.toCharArray()) { if (isText) { // outside html if (ch != '<') { sbText.append(ch); continue; } else { // switch mode isText = false; sbHtml.append(ch); continue; } }else { // inside html if (ch != '>') { sbHtml.append(ch); continue; } else { // switch mode isText = true; sbHtml.append(ch); continue; } } } return sbText.toString(); } 

Wicket使用以下方法来转义html,位于:org.apache.wicket.util.string.Strings

 public static CharSequence escapeMarkup(final String s, final boolean escapeSpaces, final boolean convertToHtmlUnicodeEscapes) { if (s == null) { return null; } else { int len = s.length(); final AppendingStringBuffer buffer = new AppendingStringBuffer((int)(len * 1.1)); for (int i = 0; i < len; i++) { final char c = s.charAt(i); switch (c) { case '\t' : if (escapeSpaces) { // Assumption is four space tabs (sorry, but that's // just how it is!) buffer.append("&nbsp;&nbsp;&nbsp;&nbsp;"); } else { buffer.append(c); } break; case ' ' : if (escapeSpaces) { buffer.append("&nbsp;"); } else { buffer.append(c); } break; case '<' : buffer.append("&lt;"); break; case '>' : buffer.append("&gt;"); break; case '&' : buffer.append("&amp;"); break; case '"' : buffer.append("&quot;"); break; case '\'' : buffer.append("&#039;"); break; default : if (convertToHtmlUnicodeEscapes) { int ci = 0xffff & c; if (ci < 160) { // nothing special only 7 Bit buffer.append(c); } else { // Not 7 Bit use the unicode system buffer.append("&#"); buffer.append(new Integer(ci).toString()); buffer.append(';'); } } else { buffer.append(c); } break; } } return buffer; } } 
 public static String stripTags(String str) { int startPosition = str.indexOf('<'); int endPosition; while (startPosition != -1) { endPosition = str.indexOf('>', startPosition); str = str.substring(0, startPosition) + (endPosition != -1 ? str.substring(endPosition + 1) : ""); startPosition = str.indexOf('<'); } return str; } 

我也有被截断的string的问题导致正则expression式无法检测到的未closures的HTML标记。 ES:

 Lorem ipsum dolor sit amet, <b>consectetur</b> adipiscing elit. <a href="abc" 

所以,参考2个最好的答案(JSoup和正则expression式),我喜欢使用JSoup的解决scheme:

 Jsoup.parse(html).text()