So entfernen oder entkommen Sie HTML-Tags in Android

77

PHP hat eine strip_tagsFunktion, die HTML- und PHP-Tags von einer Zeichenfolge entfernt.

Hat Android eine Möglichkeit, sich HTML zu entziehen?

Kris
quelle

Antworten:

239

Die Lösungen in der von @sparkymat verknüpften Antwort erfordern im Allgemeinen entweder Regex - ein fehleranfälliger Ansatz - oder die Installation einer Drittanbieter-Bibliothek wie jsoup oder jericho . Eine bessere Lösung für Android-Geräte ist die Verwendung der Funktion Html.fromHtml ():

public String stripHtml(String html) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
       return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY).toString();
    } else {
       return Html.fromHtml(html).toString();
    }
}

Hierbei wird der in Android integrierte HTML-Parser verwendet, um eine SpannedDarstellung des eingegebenen HTML- Codes ohne HTML-Tags zu erstellen . Das "Span" -Markup wird dann entfernt, indem die Ausgabe wieder in eine Zeichenfolge konvertiert wird.

Wie hier erläutert, hat sich das Verhalten von Html.fromHtml seit Android N geändert. Weitere Informationen finden Sie in der Dokumentation .

Nick Street
quelle
5
Bitte beachten Sie auch die Html.fromHtml(String)Rückgabe einer erweiterten Klasse von CharSequence. Sie können es also direkt mit Methoden verwenden, die CharSequenceParameter akzeptieren , ohne sie aufzurufen toString(). Danke Nick für die tolle Antwort :-)
4
Sie können auch verwenden, Html.escapeHtml(String)wenn Sie die Tags nur maskieren möchten, ohne sie zu entfernen.
Twaddington
1
Ich denke, Html.fromHtml (String) Methode haben begrenzte Mengen an Tag-Unterstützung
Hitesh Chavda
1
Mein HTML-Kopf hat HTML> <head> <style> body {Schriftfamilie: Verdana, serifenlos; Schriftgröße: 0.8em; Farbe: # 484848; } h1, h2, h3 {Schriftfamilie: "Trebuchet MS", Verdana, serifenlos; Rand: 0px; } h1 {Schriftgröße: 1.2em; } h2, h3 {Schriftgröße: 1.1em; } a, a: link, a: besucht {color: # 2A5685;} a: hover, a: active {color: # c61a1a; } a.wiki-anchor {Anzeige: keine; } h {Breite: 100%; Höhe: 1px; Hintergrund: #ccc; Rand: 0; } .footer {Schriftgröße: 0.8em; Schriftstil: kursiv; } </ style> </ head> Dies wird auch nicht behandelt. Bitte helfen Sie
png
4
Beachten Sie, dass Html.fromHtml(html).toString();mehrere Leerzeichen entfernt werden, was nicht immer eine gute Wahl ist.
Buddy
15

Entschuldigung für den späten Beitrag, aber ich denke, das könnte anderen helfen,

So entfernen Sie einfach die HTML-Streifen

Html.fromHtml(htmltext).toString()

Auf diese Weise wird das HTML-Tag durch eine Zeichenfolge ersetzt, die Zeichenfolge wird jedoch nicht ordnungsgemäß formatiert. Daher habe ich getan

Html.fromHtml(htmltext).toString().replaceAll("\n", "").trim()

Auf diese Weise ersetze ich zuerst durch die nächste Zeile mit Leerzeichen und entfernte Leerzeichen. Ebenso können Sie andere entfernen.

Yubaraj Poudel
quelle
Ich brauchte 4 Schrägstriche. Siehe Avis Antwort: stackoverflow.com/questions/18865393/…
Heinzlmaen
11

Sie können alternativ verwenden, Html.escapeHtml(String)wenn Sie auf API 16 oder höher abzielen.

Um auch unter API 16 zu zielen, können Sie stattdessen die folgende Klasse verwenden, indem Sie aufrufen, HtmlUtils.escapeHtml(String)die ich einfach aus der Quelle von gezogen habe Html.escapeHtml(String).

public class HtmlUtils {

    public static String escapeHtml(CharSequence text) {
        StringBuilder out = new StringBuilder();
        withinStyle(out, text, 0, text.length());
        return out.toString();
    }

    private static void withinStyle(StringBuilder out, CharSequence text,
                                    int start, int end) {
        for (int i = start; i < end; i++) {
            char c = text.charAt(i);

            if (c == '<') {
                out.append("&lt;");
            } else if (c == '>') {
                out.append("&gt;");
            } else if (c == '&') {
                out.append("&amp;");
            } else if (c >= 0xD800 && c <= 0xDFFF) {
                if (c < 0xDC00 && i + 1 < end) {
                    char d = text.charAt(i + 1);
                    if (d >= 0xDC00 && d <= 0xDFFF) {
                        i++;
                        int codepoint = 0x010000 | (int) c - 0xD800 << 10 | (int) d - 0xDC00;
                        out.append("&#").append(codepoint).append(";");
                    }
                }
            } else if (c > 0x7E || c < ' ') {
                out.append("&#").append((int) c).append(";");
            } else if (c == ' ') {
                while (i + 1 < end && text.charAt(i + 1) == ' ') {
                    out.append("&nbsp;");
                    i++;
                }

                out.append(' ');
            } else {
                out.append(c);
            }
        }
    }
}

Ich benutze diese Klasse, die gut funktioniert.

Kumpel
quelle
4

Dies gilt für eine neue Methodenalternative (API 16+):

android.text.Html.escapeHtml(your_html).toString();
Tomero Indonesien
quelle
4

Html.fromHtml kann für große HTML-Zeichenfolgen extrem langsam sein.

So können Sie es einfach und schnell mit jsoup machen:

Fügen Sie diese Zeile Ihrer Gradle-Datei hinzu:

implementation 'org.jsoup:jsoup:1.11.3'

Überprüfen Sie hier die neueste jsoup-Version: https://jsoup.org/download

Fügen Sie diese Zeile Ihrem Code hinzu:

String text = Jsoup.parse(htmlStr).text();

Überprüfen Sie diesen Link hier, um zu erfahren, wie Sie Zeilenumbrüche beibehalten:

Wie behalte ich Zeilenumbrüche bei, wenn ich mit jsoup HTML in einfachen Text konvertiere?

Live-Liebe
quelle
2
 Spanned spanned;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            spanned = Html.fromHtml(textToShare, Html.FROM_HTML_MODE_LEGACY);
        } else {
            spanned = Html.fromHtml(textToShare);
        }
tv.setText(spanned.toString());
Atif Mahmood
quelle
2

Mit jsoup ist das ganz einfach

public static String html2text(String html) {
   return Jsoup.parse(html).text();
}
Jayakrishnan
quelle