¿Hay una buena manera de eliminar HTML de una cadena Java? Una expresión regular simple como
replaceAll("\\<.*?>","")
funcionará, pero cosas como &
no se convertirán correctamente y no HTML entre los dos corchetes angulares se eliminará (es decir .*?
, desaparecerá la expresión regular).
Respuestas:
Use un analizador HTML en lugar de expresiones regulares. Esto es muy simple con Jsoup .
Jsoup también admite la eliminación de etiquetas HTML en una lista blanca personalizable, lo cual es muy útil si desea permitir solo
<b>
, por ejemplo ,<i>
y<u>
.Ver también:
fuente
Jsoup#clean()
en su lugar.<p>Lorem ipsum 1 < 3 dolor sit amet</p>
. Nuevamente, HTML no es un lenguaje normal . Está completamente fuera de mi alcance por qué todos siguen tratando de arrojar expresiones regulares para analizar partes de interés en lugar de usar un analizador real.Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
para preservar saltos de líneaSi estás escribiendo para Android , puedes hacer esto ...
fuente
Si el usuario ingresa
<b>hey!</b>
, ¿quiere mostrar<b>hey!</b>
ohey!
? Si es el primero, escape menos-thans y html-codifique símbolos (y opcionalmente comillas) y estará bien. Una modificación a su código para implementar la segunda opción sería:pero se encontrará con problemas si el usuario ingresa algo mal formado, como
<bhey!</b>
.También puede consultar JTidy, que analizará la entrada html "sucia", y debería darle una forma de eliminar las etiquetas, manteniendo el texto.
El problema al 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 (utilizando el método de reemplazo anterior, una biblioteca DOM o JTidy) , aún deberá asegurarse de codificar los caracteres especiales HTML restantes para mantener su salida segura.
fuente
Otra forma es usar javax.swing.text.html.HTMLEditorKit para extraer el texto.
ref: Eliminar etiquetas HTML de un archivo para extraer solo el TEXTO
fuente
Creo que la forma más sencilla de filtrar las etiquetas html es:
fuente
También es muy simple con Jericho , y puede conservar parte del formato (saltos de línea y enlaces, por ejemplo).
fuente
La respuesta aceptada de hacer simplemente
Jsoup.parse(html).text()
tiene 2 problemas potenciales (con JSoup 1.7.3):<script>
en<script>
Si usa esto para protegerse contra XSS, esto es un poco molesto. Aquí está mi mejor oportunidad de obtener una solución mejorada, utilizando JSoup y Apache StringEscapeUtils:
Tenga en cuenta que el último paso es porque necesito usar la salida como texto sin formato. Si solo necesita salida HTML, entonces debería poder eliminarla.
Y aquí hay un montón de casos de prueba (entrada a salida):
Si encuentra una manera de mejorarlo, hágamelo saber.
fuente
&lt;script&gt;alert('Evil script executed');&lt;/script&gt;
. Lo mismo vale para&
. JSoup no convierte<script> into <script>
, lo hace porque llamaStringEscapeUtils.unescapeHtml
después de que JSoup limpiara la entrada.En Android, intente esto:
fuente
HTML Escaping es realmente difícil de hacer bien, definitivamente sugeriría usar el código de la biblioteca para hacer esto, ya que es mucho más sutil de lo que piensas. Echa un vistazo a StringEscapeUtils de Apache para obtener una biblioteca bastante buena para manejar esto en Java.
fuente
Esto debería funcionar -
utilizar este
y esto
fuente
Es posible que desee reemplazar
<br/>
y</p>
etiquetar con nuevas líneas antes de quitar el HTML para evitar que se convierta en un lío ilegible, como sugiere Tim.La única forma en que puedo pensar en eliminar las etiquetas HTML pero dejando que no sea HTML entre paréntesis angulares sería verificar una lista de etiquetas HTML . Algo en este sentido ...
Luego, decodifique HTML caracteres especiales como
&
. El resultado no debe considerarse como desinfectado.fuente
Alternativamente, uno puede usar HtmlCleaner :
fuente
La respuesta aceptada no funcionó para mí para el caso de prueba que indiqué: el resultado de "a <b o b> c" es "ab o b> c".
Entonces, usé TagSoup en su lugar. Aquí hay una foto que funcionó para mi caso de prueba (y un par de otros):
fuente
Sé que esto es viejo, pero solo estaba trabajando en un proyecto que me requería filtrar HTML y funcionó bien:
en lugar de esto:
fuente
Aquí hay una actualización un poco más desarrollada para tratar de manejar algunos formatos para saltos y listas. Usé la salida de Amaya como guía.
fuente
Utilizar
Html.fromHtml
Las etiquetas HTML son
Según las Documentaciones oficiales de Android, cualquier etiqueta en el HTML se mostrará como una Cadena de reemplazo genérica que su programa puede revisar y reemplazar con cadenas reales .
Html.formHtml
El método toma unHtml.TagHandler
y un Html.ImageGetter como argumentos, así como el texto para analizar.Ejemplo
Entonces
Salida
Se trata de un mensaje de texto que el usuario puede poner en su perfil.
fuente
Aquí hay una variante más de cómo reemplazar todo (Etiquetas HTML | Entidades HTML | Espacio vacío en contenido HTML)
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
donde el contenido es una cadena.fuente
Simplemente puede usar el filtro HTML predeterminado de Android
El método anterior devolverá la cadena filtrada de HTML para su entrada.
fuente
Una forma más puede ser usar la clase com.google.gdata.util.common.html.HtmlToText como
Sin embargo, este no es un código a prueba de balas y cuando lo ejecuto en las entradas de wikipedia también obtengo información de estilo. Sin embargo, creo que para trabajos pequeños / simples esto sería efectivo.
fuente
Parece que quiere pasar de HTML a texto sin formato.
Si ese es el caso, visite www.htmlparser.org. Aquí hay un ejemplo que elimina todas las etiquetas del archivo html que se encuentra en una URL.
Hace uso de org.htmlparser.beans.StringBean .
fuente
Aquí hay otra forma de hacerlo:
fuente
También se podría usar Apache Tika para este propósito. De forma predeterminada, conserva espacios en blanco del HTML despojado, lo que puede desearse en ciertas situaciones:
fuente
Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
.Una forma de retener información de nueva línea con JSoup es preceder todas las nuevas etiquetas de línea con alguna cadena ficticia, ejecutar JSoup y reemplazar la cadena ficticia con "\ n".
fuente
fuente
Mis 5 centavos:
fuente
Para obtener texto HTML simple con formato , puede hacer eso:
Para obtener formato de texto sin formato, cambie <br/> por \ ny cambie la última línea por:
fuente
Sé que ha pasado un tiempo desde que se hizo esta pregunta, pero encontré otra solución, esto es lo que funcionó para mí:
fuente
simplemente puede hacer un método con varios replaceAll () como
Use este enlace para los reemplazos más comunes que necesita: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html
Es simple, pero efectivo. Uso este método primero para eliminar la basura pero no la primera línea, es decir, reemplazar todo ("\ <. *?>", ""), Y luego uso palabras clave específicas para buscar índices y luego uso .substring (inicio, fin ) método para eliminar cosas innecesarias. Como esto es más robusto y puede señalar exactamente lo que necesita en toda la página html.
fuente
Eliminar etiquetas HTML de la cadena. En algún lugar necesitamos analizar alguna cadena que es recibida por algunas respuestas como Httpresponse del servidor.
Por lo tanto, debemos analizarlo.
Aquí mostraré cómo eliminar etiquetas html de la cadena.
fuente
new System.Text.RegularExpressions.Regex();
?