2011-09-08 15 views
5

Voglio rimuovere i tag HTML da una stringa. Questo è facile, lo so, l'ho fatto:Rimuovere alcuni tag HTML con RegExp e Java

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

Il problema è che io non voglio rimuovere tutti i tag .. Voglio che il tag

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

soggiorno intatta nella stringa ..

sto usando questo come una sorta di "punto culminante" nella ricerca di un'applicazione web utilizzando GWT che sto facendo ...

E ho bisogno di fare questo, perché se la ricerca trova TE xt che contiene qualche tag HTML (l'indicizzazione è fatta da Lucene), ed è rotta, appendHTML da safeHTMLBuilder non è in grado di montare una stringa.

È possibile farlo in un modo abbastanza buono?

Abbracci.

+1

queste domande sono molto frequenti in questi giorni. Perché non possiamo raggruppare le domande simili insieme? * # SO tip *;) –

+0

è un vero uomo. – caarlos0

+0

Assicurati di prendere in considerazione anche i valori di riferimento delle entità. – Edward

risposta

4

Si consiglia vivamente di utilizzare JSoup per questa attività. Le espressioni regolari semplicemente non sono adatte per questo compito imo. E con JSoup questo è fondamentalmente un one-liner semplice, leggibile e facilmente mantenibile!

Dai un'occhiata alla metodo JSoup.clean, e forse questo articolo:

+0

che rimuoverà tutti i miei tag HTML. – caarlos0

+0

Oh no ... puoi fornire il metodo con una lista bianca di tag con cui non vuoi interferire. – aioobe

+0

hmmm, proverò ... – caarlos0

0

Una libreria che ho usato con grande efficacia in passato è OWASP AntiSamy

Questo sicuramente consente l'inserimento di whitelist/blacklist dei tag. Potrebbe valere la pena dare un'occhiata.

+0

jsoup sembra meglio .. – caarlos0

+0

Grazie, terrò conto di questa liberia la prossima volta che ho bisogno di fare questo genere di cose. – extorn

1

ho trovato una soluzione per questo problema utilizzando solo le espressioni regolari:

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

essere sicuri che si Non tiratevi uso "{{...}}" nel contenuto HTML. È possibile modificare facilmente questa "sequenza di salvataggio". I tag validi sono definiti nella lista dei primi replaceAll espressione regolare:

(a | h \ d | b | i | em | citare | Codice | forte | pre | BR)

Il "h \ d" nella lista sopra significa "h1, h2, ..." sono tag validi.

Ho provato questo con questo codice:

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

Bye, Sergio Figueiredo - My blog

Problemi correlati