2009-11-09 19 views
10

Esiste l'espressione regolare che può rimuovere completamente un tag HTML? A proposito, sto usando Java.Come rimuovere il tag HTML in Java

+2

Digitando il titolo nella casella di ricerca, ho ottenuto il seguente: http://stackoverflow.com/search?q=How+to+remove+HTML+tag + in + Java ... non hai ottenuto lo stesso mentre stavi postando la domanda? – kdgregory

+2

Non ho trovato duplicati. Queste domande riguardano l'estrazione di testo da HTML: http://stackoverflow.com/questions/240546/removing-html-from-a-java-string http: // stackoverflow.it/questions/832620/stripping-html-tags-in-java – tangens

risposta

20

È consigliabile utilizzare un parser HTML. Mi piace htmlCleaner, perché mi dà una versione stampata dell'HTML.

Con htmlCleaner si può fare:

TagNode root = htmlCleaner.clean(stream); 
Object[] found = root.evaluateXPath("//div[id='something']"); 
if(found.length > 0 && found instanceof TagNode) { 
    ((TagNode)found[0]).removeFromTree(); 
} 
+0

Grazie per avermi indirizzato a htmlCleaner :) – exhuma

+0

Abbiamo bisogno di ottenere qualsiasi libreria in ordine per utilizzare questo codice sopra? E root.evaluateXPath ("// div [id = 'something']"); in questo "qualcosa" potrebbe esserci qualche rito? Per favore mi faccia sapere. grazie –

4

No. Le espressioni regolari non può, per definizione, di analisi HTML.

È possibile utilizzare un'espressione regolare a s/<[^>]*\>// o qualcosa di simile in questo modo, ma sarà insufficiente, soprattutto se si è interessati a rimuovere il contenuto dei tag.

Come un altro poster ha detto, utilizzare un parser HTML effettivo.

4

Se avete solo bisogno di rimuovere i tag quindi è possibile utilizzare questa espressione regolare:

content = content.replaceAll("<[^>]+>", ""); 

Sarà rimuovere solo i tag, ma non altre cose HTML. Per cose più complesse dovresti usare parser.

EDIT: Per evitare problemi con commenti HTML è possibile effettuare le seguenti operazioni:

content = content.replaceAll("<!--.*?-->", "").replaceAll("<[^>]+>", ""); 
+0

Dato che non si usano nessuno dei caratteri di carne '.','^'e' $', i flag 's'- e' m' possono essere omessi. –

+0

Questa espressione regolare è suscettibile di provocare il mangling se l'HTML contiene commenti XML con caratteri "<' or '>" incorporati. –

0

In alternativa, se il vostro intento è quello di visualizzazione ingresso controllato dall'utente al client, allora si può anche è sufficiente sostituire tutti gli < entro il &lt; e tutti gli > entro il &gt;. In questo modo l'HTML non verrà interpretato così com'è dall'applicazione del client (il browser).

Se si utilizza JSP come tecnologia di visualizzazione, è possibile utilizzare JSTL c:out per questo. Per impostazione predefinita, sfuggirà a tutte le entità HTML. Ad esempio, per esempio

<c:out value="<script>alert('XSS');</script>" /> 

NON visualizza l'avviso, ma mostra semplicemente la stringa attuale così com'è.

0

è possibile utilizzare questo semplice codice per rimuovere tutti i tag html ...

htmlString.replaceAll("\\<.*?\\>", "")) 
+1

Questo rimuoverà solo i tag di apertura e lascerà i tag di chiusura non gestiti. – jlordo

+0

non avrei mai fatto un lavoro del genere per conto mio - l'analisi di html in testo semplice è davvero un lavoro tizio .. – jebbie

+0

Ha funzionato per me ma forse dipende dalla complessità dei tag, commenti, script, ecc. Quindi, per un caso complesso forse una libreria html dovrebbe essere migliore. – jmoran

16

C'è JSoup che è una libreria Java per la manipolazione fatta HTML. Guarda il metodo clean() e l'oggetto WhiteList. Soluzione facile da usare!

+2

WOW, signore, mi hai davvero dedicato la giornata, mi piace, SÌ! Markdownj, Markdown4J, htmlCleaner .. tutti sono ***** scusate .. JSoup è l'unico e solo dove lo realizzi davvero con una sola riga: String plain = new HtmlToPlainText(). GetPlainText (Jsoup.parse (html)); – jebbie

+4

Un codice più corto sarebbe 'String plaintext = Jsoup.parse (html) .text();' – jrarama

+2

@jrarama - Niente affatto. 'Jsoup.parse (html) .text()' rimuove tutti i tag e gli spazi bianchi, lasciando solo una lunga singola riga di testo, mentre 'new HtmlToPlainText(). GetPlainText (Jsoup.parse (html))' formatta il formato testo in modo semplicistico, mantenendo interruzioni di riga, paragrafi, punti elenco, ecc. – isapir

1

Non è necessario alcun parser HTML. Il codice di seguito rimuove tutti i commenti HTML:

htmlString = htmlString.replaceAll("(?s)<!--.*?-->", "");

Problemi correlati