2011-09-08 22 views
5

Quiero eliminar etiquetas HTML de una Cadena. Esto es fácil, lo sé, por lo que hice:Eliminar algunas etiquetas HTML con RegExp y Java

public String removerTags(String html) 
    { 
     return html.replaceAll("\\<(/?[^\\>]+)\\>", " ").replaceAll("\\s+", " ").trim(); 
    } 

El problema es que no quiero para eliminar todas las etiquetas .. Quiero la etiqueta

<span style=\"background-color: yellow\"> (text) </ span> 

estancia en la cadena intacta ..

estoy usando esto como una especie de "destacado" en la búsqueda de una aplicación web usando GWT que estoy haciendo ...

Y necesito hacer esto, ya que si la búsqueda encuentra te xt que contiene alguna etiqueta HTML (la indexación es hecha por Lucene), y está rota, el appendHTML de safeHTMLBuilder no puede montar una Cadena.

¿Puedes hacer esto de una manera bastante buena?

Abrazos.

+1

Estas preguntas son muy frecuentes en estos días. ¿Por qué no podemos agrupar preguntas similares juntas? * # SO tip *;) –

+0

ese es el verdadero hombre. – caarlos0

+0

Asegúrese de tener en cuenta los valores de referencia de entidad también. – Edward

Respuesta

4

Sugiero que use JSoup para esta tarea. Las expresiones regulares simplemente no son adecuadas para esta tarea. ¡Y con JSoup esto es básicamente un simple, fácil de leer y fácil de mantener!

Tenga una mirada en el método JSoup.clean, y tal vez este artículo:

+0

que eliminará todas mis etiquetas HTML. – caarlos0

+0

Oh no ... puede proporcionarle al método una lista blanca de etiquetas con las que no desea que interfiera. – aioobe

+0

hmmm, lo intentaré ... – caarlos0

0

Una biblioteca que he utilizado con gran éxito en el pasado es OWASP AntiSamy

Esto definitivamente permite listas blancas/listas negras de etiquetas. Puede valer la pena mirar.

+0

jsoup parece mejor .. – caarlos0

+0

Gracias, tendré en cuenta esa biblioteca la próxima vez que necesite hacer este tipo de cosas. – extorn

1

he encontrado una solución para este problema utilizando únicamente las expresiones regulares:

public static String filterHTMLTags(String html) { 

    // save valid tags: 
    String striped = html.replaceAll("(?i)\\<(\\s*/?(a|h\\d|b|i|em|cite|code|strong|pre|br).*?/?)\\>", "{{$1}}"); 
    // remove all tags: 
    striped = striped.replaceAll("\\<(/?[^\\>]+)\\>", " "); 
    // restore valid tags: 
    striped = striped.replaceAll("\\{\\{(.+?)\\}\\}", "<$1>"); 

    return striped; 
} 

estar seguro de que No usar "{{...}}" en su contenido html. Puede cambiar esta "secuencia de guardado" fácilmente. Las etiquetas válidas se definen en la lista de la primera replaceAll expresión regular:

(a | h \ d | b | i | em | citar | Código | fuerte | pre | br)

El "h \ d" en la lista anterior significa "h1, h2, ..." son etiquetas válidas.

He probado esto con este código:

public static void main (String[] args) { 

    String teste = " <b>test bold chars</b> <BR/> <div>test div</div> \n" + 
      " link: <a href=\"test.html\">click here</a> <br />\n" + 
      " <script>bad script</script> <notpermitted/>\n"; 

    System.out.println("teste: \n"+teste); 
    System.out.println("\n\n\nstriped: \n"+filterHTMLTags(teste)); 
} 

adiós, Sergio Figueiredo - My blog

Cuestiones relacionadas