Gibt es eine gute Möglichkeit, HTML aus einer Java-Zeichenfolge zu entfernen? Ein einfacher Regex wie
replaceAll("\\<.*?>","")
wird funktionieren, aber Dinge wie werden &
nicht korrekt konvertiert und Nicht-HTML zwischen den beiden spitzen Klammern wird entfernt (dh die .*?
in der Regex verschwinden).
Antworten:
Verwenden Sie einen HTML-Parser anstelle von Regex. Mit Jsoup ist das ganz einfach .
Jsoup auch unterstützt HTML - Tags gegen eine anpassbare weißen Liste zu entfernen, was sehr nützlich ist , wenn Sie zB zulassen möchten
<b>
,<i>
und<u>
.Siehe auch:
quelle
Jsoup#clean()
stattdessen verwenden.<p>Lorem ipsum 1 < 3 dolor sit amet</p>
. Auch hier ist HTML keine reguläre Sprache . Es ist mir völlig unverständlich, warum jeder versucht, Regex darauf zu werfen, um Teile von Interesse zu analysieren, anstatt einen echten Parser zu verwenden.Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
, um Zeilenumbrüche zu bewahrenWenn Sie für Android schreiben , können Sie dies tun ...
quelle
Wenn der Benutzer eintritt
<b>hey!</b>
, möchten Sie anzeigen<b>hey!</b>
oderhey!
? Wenn dies der erste Fall ist, entkommen Sie weniger als und codieren kaufmännisches Und (und optional Anführungszeichen) in HTML, und es geht Ihnen gut. Eine Änderung an Ihrem Code zur Implementierung der zweiten Option wäre:Sie werden jedoch auf Probleme stoßen, wenn der Benutzer etwas Falsches eingibt, wie z
<bhey!</b>
.Sie können auch JTidy ausprobieren das "schmutzige" HTML-Eingaben analysiert und Ihnen eine Möglichkeit bietet, die Tags zu entfernen und den Text .
Das Problem beim Versuch, HTML zu entfernen, besteht darin, dass Browser sehr milde Parser haben, die milder sind als jede Bibliothek, die Sie finden können. Selbst wenn Sie Ihr Bestes tun, um alle Tags zu entfernen (mithilfe der obigen Ersetzungsmethode, einer DOM-Bibliothek oder JTidy) Sie müssen weiterhin sicherstellen, dass alle verbleibenden HTML-Sonderzeichen codiert sind, um Ihre Ausgabe sicher zu halten.
quelle
Eine andere Möglichkeit besteht darin , den Text mit javax.swing.text.html.HTMLEditorKit zu extrahieren.
ref: Entfernen Sie HTML-Tags aus einer Datei, um nur den TEXT zu extrahieren
quelle
Ich denke, dass der einfachste Weg, die HTML-Tags zu filtern, ist:
quelle
Auch sehr einfach mit Jericho , und Sie können einige der Formatierungen beibehalten (z. B. Zeilenumbrüche und Links).
quelle
Die akzeptierte Antwort
Jsoup.parse(html).text()
hat einfach zwei mögliche Probleme (mit JSoup 1.7.3):<script>
in<script>
Wenn Sie dies zum Schutz vor XSS verwenden, ist dies etwas ärgerlich. Hier ist mein bester Versuch einer verbesserten Lösung mit JSoup und Apache StringEscapeUtils:
Beachten Sie, dass der letzte Schritt darin besteht, dass ich die Ausgabe als einfachen Text verwenden muss. Wenn Sie nur HTML-Ausgabe benötigen, sollten Sie diese entfernen können.
Und hier sind einige Testfälle (Eingabe zu Ausgabe):
Wenn Sie einen Weg finden, es besser zu machen, lassen Sie es mich bitte wissen.
quelle
&lt;script&gt;alert('Evil script executed');&lt;/script&gt;
. Gleiches gilt für&
. JSoup konvertiert nicht<script> into <script>
, dies geschieht, weil Sie aufrufen,StringEscapeUtils.unescapeHtml
nachdem JSoup die Eingabe bereinigt hat.Versuchen Sie dies auf Android:
quelle
HTML-Escaping ist wirklich schwer richtig zu machen - ich würde definitiv empfehlen, Bibliothekscode zu verwenden, da dies viel subtiler ist, als Sie denken. In StringEscapeUtils von Apache finden Sie eine ziemlich gute Bibliothek, um dies in Java zu handhaben.
quelle
Das sollte funktionieren -
benutze das
und das
quelle
Vielleicht möchten Sie ersetzen
<br/>
und</p>
neue Zeilen Tags versehen, bevor Sie den HTML-Code entfernen, um zu verhindern, dass er unleserlich wird, wie Tim vorschlägt.Die einzige Möglichkeit, HTML-Tags zu entfernen, aber Nicht-HTML in spitzen Klammern zu belassen, besteht darin, eine Liste von HTML-Tags zu verwenden . Etwas in diese Richtung ...
Dann HTML-decodieren Sonderzeichen wie
&
. Das Ergebnis sollte nicht als hygienisch angesehen werden.quelle
Alternativ kann man HtmlCleaner verwenden :
quelle
Die akzeptierte Antwort funktionierte für mich für den von mir angegebenen Testfall nicht: Das Ergebnis von "a <b oder b> c" ist "ab oder b> c".
Also habe ich stattdessen TagSoup verwendet. Hier ist eine Aufnahme, die für meinen Testfall (und einige andere) funktioniert hat:
quelle
Ich weiß, dass dies alt ist, aber ich habe gerade an einem Projekt gearbeitet, bei dem ich HTML filtern musste, und das hat gut funktioniert:
an Stelle von:
quelle
Hier ist ein etwas ausführlicheres Update, um zu versuchen, einige Formatierungen für Pausen und Listen vorzunehmen. Ich habe Amayas Ausgabe als Leitfaden verwendet.
quelle
Verwenden
Html.fromHtml
HTML- Tags sind
Gemäß offiziellen Dokumentationen Android keine Tags im HTML wird als generischer Ersatz angezeigt String , die das Programm dann durch und ersetzen mit echten gehen können Strings .
Html.formHtml
Die Methode verwendet einHtml.TagHandler
und ein Html.ImageGetter als Argumente sowie den zu analysierenden Text.Beispiel
Dann
Ausgabe
Hier geht es um mich Text, den der Benutzer in sein Profil einfügen kann
quelle
Hier ist eine weitere Variante, wie alle ersetzt werden können (HTML-Tags | HTML-Entitäten | Leerraum in HTML-Inhalten).
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
Dabei ist der Inhalt ein String.quelle
Sie können einfach den Standard-HTML-Filter von Android verwenden
Die obige Methode gibt die HTML-gefilterte Zeichenfolge für Ihre Eingabe zurück.
quelle
Eine weitere Möglichkeit kann darin bestehen, die Klasse com.google.gdata.util.common.html.HtmlToText wie zu verwenden
Dies ist jedoch kein kugelsicherer Code, und wenn ich ihn auf Wikipedia-Einträgen ausführe, erhalte ich auch Stilinformationen. Ich glaube jedoch, dass dies für kleine / einfache Jobs effektiv wäre.
quelle
Es hört sich so an, als ob Sie von HTML zu einfachem Text wechseln möchten.
Wenn dies der Fall ist, schauen Sie auf www.htmlparser.org. In diesem Beispiel werden alle Tags aus der HTML-Datei entfernt, die unter einer URL gefunden wurde.
Es verwendet org.htmlparser.beans.StringBean .
quelle
Hier ist eine andere Möglichkeit:
quelle
Zu diesem Zweck könnte man auch Apache Tika verwenden. Standardmäßig werden Leerzeichen aus dem entfernten HTML-Code beibehalten, was in bestimmten Situationen erwünscht sein kann:
quelle
Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
.Eine Möglichkeit, neue Zeileninformationen mit JSoup beizubehalten, besteht darin, allen neuen Zeilen-Tags eine Dummy-Zeichenfolge voranzustellen, JSoup auszuführen und die Dummy-Zeichenfolge durch "\ n" zu ersetzen.
quelle
Meine 5 Cent:
quelle
Um formatierten einfachen HTML-Text zu erhalten , können Sie Folgendes tun:
Um formatierten Klartext zu erhalten, ändern Sie <br/> um \ n und die letzte Zeile um:
quelle
quelle
Ich weiß, dass es eine Weile her ist, seit diese Frage gestellt wurde, aber ich habe eine andere Lösung gefunden. Das hat bei mir funktioniert:
quelle
Sie können einfach eine Methode mit mehreren replaceAll () wie erstellen
Verwenden Sie diesen Link für die häufigsten Ersetzungen, die Sie benötigen: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html
Es ist einfach aber effektiv. Ich benutze diese Methode zuerst, um den Müll zu entfernen, aber nicht die allererste Zeile, dh replaceAll ("\ <. *?>", ""), Und später verwende ich bestimmte Schlüsselwörter, um nach Indizes zu suchen, und verwende dann .substring (start, end ) Methode, um unnötiges Zeug zu entfernen. Da dies robuster ist und Sie genau das bestimmen können, was Sie auf der gesamten HTML-Seite benötigen.
quelle
Entfernen Sie HTML-Tags aus der Zeichenfolge. Irgendwo müssen wir eine Zeichenfolge analysieren, die von einigen Antworten wie Httpresponse vom Server empfangen wird.
Also müssen wir es analysieren.
Hier werde ich zeigen, wie man HTML-Tags aus dem String entfernt.
quelle
new System.Text.RegularExpressions.Regex();
?