Pelar tags HTML en Java

¿Existe una biblioteca Java existente que proporcione un método para quitar todas las tags HTML de una Cadena? Estoy buscando algo equivalente a la función strip_tags en PHP.

Sé que puedo usar una expresión regular como se describe en esta pregunta de Stackoverflow , sin embargo, tenía curiosidad de saber si ya podría haber un método stripTags() flotando en algún lugar de la biblioteca de Apache Commons que se pueda usar.

Use JSoup , está bien documentado, disponible en Maven y después de un día de pasar tiempo con varias bibliotecas, para mí es el mejor que puedo imaginar. Mi propia opinión es que un trabajo como ese, analizando html en lenguaje simple. texto, debería ser posible en una línea de código -> de lo contrario, la biblioteca ha fallado de alguna manera … simplemente diciendo ^^ Así que aquí está, el delineador de JSoup – en Markdown4J, algo así no es posible, en Markdownj también , en htmlCleaner esto es dolor en el culo con algo así como 50 líneas de código …

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

Y lo que obtienes es texto plano real (no solo el código fuente html como String, como en otras libs lol) -> realmente hace un gran trabajo al respecto. Es más o menos la misma calidad que Markdownify para PHP ….

Esto es lo que encontré en google en él. Para mí funcionó bien.

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

Hagas lo que hagas, asegúrate de normalizar los datos antes de comenzar a tratar de quitar las tags. Recientemente asistí a un taller de seguridad de aplicaciones web que cubría la evasión de filtros XSS. Normalmente, uno pensaría que la búsqueda de < o < o su equivalente hexadecimal sería suficiente. Me quedé impresionado después de ver una diapositiva con 70 formas en que < puede codificarse para vencer a los filtros.

Actualizar:

A continuación se muestra la presentación a la que me refería, ver diapositiva 26 para las 70 formas de codificar < .

Evasión de filtro: Houdini en el cable

Puede haber algunos, pero lo más robusto es usar un analizador de HTML real. Aquí hay uno, y si está razonablemente bien formado, también puede usar SAX u otro analizador XML.

Después de tener esta pregunta abierta durante casi una semana, puedo decir con cierta certeza que no hay ningún método disponible en la API de Java o en las bibliotecas de Apache que elimina las tags HTML de una Cadena. Tendría que usar un analizador HTML como se describe en las respuestas anteriores, o escribir una expresión regular simple para quitar las tags.

He usado nekoHtml para hacer eso. Puede quitar todas las tags, pero también puede mantener o quitar un subconjunto de tags.

Cuando usas Jsoup es incluso más fácil que lo descrito en las respuestas anteriores:

 String html = "bla hehe 
this is awesome simple"; String text = Jsoup.parse(html).text();

Sé que esta pregunta es bastante antigua, pero he estado buscando esto también y parece que todavía no es fácil encontrar una solución buena y fácil en Java.

Hoy encontré esta pequeña función lib. En realidad, intenta imitar la función php strip_tags .

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

Funciona así (copiado de su sitio):

  import static com.lyncode.jtwig.functions.util.HtmlUtils.stripTags; public class StripTagsExample { public static void main(String... args) { String result = stripTags("Test", ""); // Produced result: Test } } 

Hola, sé que este hilo es antiguo, pero aún salió en la cima de Google, y estaba buscando una solución rápida para el mismo problema. No pude encontrar nada útil, así que se me ocurrió este fragmento de código. Espero que ayude a alguien. Simplemente pasa por encima de la cadena y se salta todas las tags. Simple y simple.

 boolean intag = false; String inp = "

Some HTML text"; 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;

Con un enfoque iterativo puro y sin expresiones regulares:

 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(); } 

Debido a la abreviatura (truncado de cadenas) del fragmento html, también tuve el problema de las tags html no cerradas que Regex no puede detectar. P.ej:

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.  

Entonces, refiriéndome a las 2 mejores respuestas (JSoup y regex), preferí una solución usando JSoup:

 Jsoup.parse(html).text() 

Wicket utiliza el siguiente método para escapar de html, que se encuentra en: 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("    "); } else { buffer.append(c); } break; case ' ' : if (escapeSpaces) { buffer.append(" "); } else { buffer.append(c); } break; case '<' : buffer.append("<"); break; case '>' : buffer.append(">"); break; case '&' : buffer.append("&"); break; case '"' : buffer.append("""); break; case '\'' : buffer.append("'"); 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; }