2009-11-09 5 views
10

Gibt es den regulären Ausdruck, der ein HTML-Tag vollständig entfernen kann? Übrigens verwende ich Java.Wie HTML-Tag in Java entfernen

+2

Typing Ihren Titel in das Suchfeld ein, ich habe folgende Möglichkeiten: http://stackoverflow.com/search?q=How+to+remove+HTML+tag + in + Java ... hast du nicht dasselbe bekommen als du die Frage gepostet hast? – kdgregory

+2

Ich habe keine Duplikate gefunden. Diese Fragen interessieren sich für das Extrahieren von Text aus HTML: http://stackoverflow.com/questions/240546/removing-html-from-a-java-string http: // stackoverflow.com/questions/832620/stripping-html-tags-in-java – tangens

Antwort

20

Sie sollten stattdessen einen HTML-Parser verwenden. Ich mag htmlCleaner, weil es mir eine hübsche gedruckte Version des HTML gibt.

Mit htmlCleaner können Sie tun:

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

Vielen Dank für mich auf htmlCleaner :) – exhuma

+0

Brauchen wir irgendeine Bibliothek in Ordnung, um diesen obigen Code zu verwenden? Und root.evaluateXPath ("// div [id = 'etwas']"); in diesem "etwas" könnte jeder id rite sein? lass es mich wissen, bitte. Danke –

4

Nr Reguläre Ausdrücke können nicht per definitionem Parsing HTML.

Sie könnten eine Regex zu s/<[^>]*\>// oder etwas naives so verwenden, aber es wird nicht ausreichen, vor allem, wenn Sie daran interessiert sind, den Inhalt von Tags zu entfernen.

Wie ein anderes Plakat sagte, verwenden Sie einen tatsächlichen HTML-Parser.

4

Wenn Sie müssen nur Tags entfernen, dann können Sie diesen regulären Ausdruck verwenden:

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

Es wird nur Tags entfernen, aber nicht andere HTML-Sachen. Für komplexere Dinge sollten Sie Parser verwenden.

EDIT: Um Probleme mit HTML zu vermeiden Kommentare, die Sie folgendes tun:

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

Da Sie keine der Fleischzeichen '.', '^' und '$' verwenden, können die 's'- und' m'-Flags weggelassen werden. –

+0

Diese Regex kann Mangeln verursachen, wenn der HTML-Code XML-Kommentare mit eingebetteten '<' or '>'-Zeichen enthält. –

0

Alternativ, wenn Ihre Absicht zu Anzeige benutzergesteuerten Eingang zurück an den Client ist, können Sie dann können auch ersetzen Sie einfach alle < durch &lt; und alle > durch &gt;. Auf diese Weise wird der HTML-Code nicht so interpretiert, wie er von der Client-Anwendung (dem Webbrowser) interpretiert wird. Wenn Sie JSP als Ansichtstechnologie verwenden, können Sie JSTLs c:out dafür verwenden. Es wird standardmäßig alle HTML-Entities verlassen. So zum Beispiel

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

wird nicht die Warnung anzeigen, aber zeigen Sie die tatsächliche Zeichenfolge wie sie ist.

0

Sie diesen einfachen Code verwenden können alle HTML-Tags entfernen ...

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

Dadurch werden nur öffnende Tags entfernt und die abschließenden Tags nicht behandelt. – jlordo

+0

ich würde nie einen Job so allein machen - Parsing HTML in Klartext ist wirklich ein Job, aber Typ .. – jebbie

+0

Es funktionierte für mich, aber vielleicht hängt von der Komplexität der Tags, Kommentare, Skripte usw. Also, Für einen komplexen Fall sollte vielleicht eine HTML-Bibliothek besser sein. – jmoran

16

Es gibt JSoup, die eine Java-Bibliothek für die HTML-Manipulation gemacht ist. Sehen Sie sich die clean() Methode und das WhiteList Objekt an. Einfach zu bedienende Lösung!

+2

WOW, Sir, ich habe wirklich meinen Tag gemacht, ich mag das, JA! Markdownj, Markdown4J, htmlCleaner .. alle von ihnen ist ***** Entschuldigung .. JSoup ist die einzige, wo Sie wirklich das mit einem Einzeiler erreichen: String plain = neu HtmlToPlainText(). GetPlainText (Jsoup.parse (html)); – jebbie

+4

Ein kürzerer Code wäre 'String plaintext = Jsoup.parse (html) .text();' – jrarama

+2

@jrarama - Überhaupt nicht. 'Jsoup.parse (html) .text()' entfernen Sie alle Tags und Leerzeichen, so dass Sie nur eine lange Zeile Text haben, während 'new HtmlToPlainText(). GetPlainText (Jsoup.parse (html))' formatiert Text auf einfache Art und Weise, Zeilenumbrüche, Absätze, Aufzählungszeichen usw. – isapir

1

Sie benötigen keinen HTML-Parser. Der Code unten entfernt alle HTML-Kommentare:

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