Eliminar etiquetas HTML de una cadena
¿Existe una buena manera de eliminar HTML de una cadena de Java? Una expresión regular simple como
replaceAll("\\<.*?>", "")
funcionará, pero algunas cosas como &
no se convertirán correctamente y se eliminarán los textos que no sean HTML entre los dos corchetes angulares (es decir, la .*?
expresión regular desaparecerá).
Utilice un analizador HTML en lugar de expresiones regulares. Esto es muy simple con Jsoup .
public static String html2text(String html) {
return Jsoup.parse(html).text();
}
Jsoup también admite la eliminación de etiquetas HTML en una lista blanca personalizable, lo cual es muy útil si desea permitir solo, por ejemplo <b>
, <i>
y <u>
.
Ver también:
- RegEx coincide con etiquetas abiertas, excepto etiquetas XHTML autocontenidas
- ¿Cuáles son las ventajas y desventajas de los principales analizadores HTML de Java?
- Prevención XSS en aplicaciones web JSP/Servlet
Si estás escribiendo para Android , puedes hacer esto...
androidx.core.text.HtmlCompat.fromHtml(instrucción,HtmlCompat.FROM_HTML_MODE_LEGACY).toString()
Si el usuario ingresa <b>hey!</b>
, ¿quiere mostrar <b>hey!</b>
o hey!
? Si es el primero, escape menos que y codifique los símbolos comerciales en html (y, opcionalmente, comillas) y estará bien. Una modificación a su código para implementar la segunda opción sería:
replaceAll("\\<[^>]*>","")
pero tendrás problemas si el usuario ingresa algo con formato incorrecto, como <bhey!</b>
.
También puede consultar JTidy , que analizará la entrada html "sucia" y debería brindarle una manera de eliminar las etiquetas, manteniendo el texto.
El problema de intentar eliminar HTML es que los navegadores tienen analizadores muy indulgentes, más indulgentes que cualquier biblioteca que pueda encontrar, por lo que incluso si hace todo lo posible para eliminar todas las etiquetas (usando el método de reemplazo anterior, una biblioteca DOM o JTidy) , aún deberá asegurarse de codificar los caracteres especiales HTML restantes para mantener segura su salida.