Jak usunąć lub uniknąć tagów HTML w systemie Android

81

PHP ma strip_tagsfunkcję, która usuwa znaczniki HTML i PHP z ciągu znaków.

Czy Android ma sposób na uniknięcie HTML?

Kris
źródło

Odpowiedzi:

242

Rozwiązania w odpowiedzi, do których odwołuje się @sparkymat, zazwyczaj wymagają albo wyrażenia regularnego - co jest podejściem podatnym na błędy - albo zainstalowania biblioteki innej firmy, takiej jak jsoup lub jericho . Lepszym rozwiązaniem na urządzeniach z Androidem jest użycie funkcji 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();
    }
}

Korzysta z wbudowanego parsera HTML systemu Android, aby zbudować Spannedreprezentację wejściowego kodu HTML bez żadnych tagów HTML. Znacznik „Span” jest następnie usuwany przez przekształcenie wyniku z powrotem w łańcuch.

Jak omówiono tutaj , zachowanie Html.fromHtml zmieniło się od czasu Androida N. Więcej informacji można znaleźć w dokumentacji .

Nick Street
źródło
5
Zwróć również uwagę, aby Html.fromHtml(String)zwrócić rozszerzoną klasę CharSequence. Możesz więc używać go bezpośrednio z metodami akceptującymi CharSequenceparametry, bez wywoływania toString(). Dzięki Nick za świetną odpowiedź :-)
4
Możesz również użyć, Html.escapeHtml(String)jeśli chcesz po prostu uciec od tagów bez ich usuwania.
twaddington,
1
Myślę, że metoda Html.fromHtml (String) ma ograniczone zestawy obsługi tagów
Hitesh Chavda
1
Moja głowa html ma html> <head> <style> body {font-family: Verdana, sans-serif; rozmiar czcionki: 0,8em; kolor: # 484848; } h1, h2, h3 {rodzina czcionek: "Trebuchet MS", Verdana, sans-serif; margines: 0px; } h1 {font-size: 1.2em; } h2, h3 {rozmiar czcionki: 1.1em; } a, a: link, a: odwiedzone {color: # 2A5685;} a: hover, a: active {color: # c61a1a; } a.wiki-anchor {display: none; } hr {width: 100%; wysokość: 1px; tło: #ccc; border: 0; } .footer {rozmiar czcionki: 0.8em; styl czcionki: kursywa; } </style> </head> to też nie jest obsługiwane. Pls help
png
4
Pamiętaj, że Html.fromHtml(html).toString();usuwa wiele spacji, co nie zawsze jest dobrym wyborem.
Kolego
15

Przepraszam za późny post, ale myślę, że może to pomóc innym,

Aby po prostu usunąć paski HTML

Html.fromHtml(htmltext).toString()

W ten sposób tag HTML zostanie zastąpiony ciągiem znaków, ale ciąg nie zostanie poprawnie sformatowany. Dlatego tak zrobiłem

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

W ten sposób najpierw zastępuję następną linią spacją i usuwam spację. Podobnie możesz usunąć innych.

yubaraj poudel
źródło
Potrzebowałem 4 cięć. Zobacz odpowiedź Avis: stackoverflow.com/questions/18865393/…
Heinzlmaen
11

Możesz alternatywnie użyć, Html.escapeHtml(String)jeśli celujesz w interfejs API 16 lub nowszy.

Aby również kierować reklamy poniżej API 16, możesz zamiast tego użyć poniższej klasy, wywołując ją HtmlUtils.escapeHtml(String)po prostu wyciągnąłem ze źródła 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);
            }
        }
    }
}

Używam tej klasy, która działa dobrze.

Kumpel
źródło
4

Dotyczy to nowej metody alternatywnej (API 16+):

android.text.Html.escapeHtml(your_html).toString();
Tomero Indonesia
źródło
4

Html.fromHtml może działać bardzo wolno w przypadku dużych ciągów HTML.

Oto, jak możesz to zrobić, łatwo i szybko z jsoup:

Dodaj tę linię do swojego pliku gradle:

implementation 'org.jsoup:jsoup:1.11.3'

Sprawdź, jaka jest najnowsza wersja jsoup tutaj: https://jsoup.org/download

Dodaj tę linię do swojego kodu:

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

Sprawdź ten link tutaj, aby dowiedzieć się, jak zachować podziały wierszy:

Jak zachować podziały wierszy podczas używania jsoup do konwersji HTML na zwykły tekst?

miłość na żywo
źródło
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
źródło
2

To jest banalnie proste w przypadku jsoup

public static String html2text(String html) {
   return Jsoup.parse(html).text();
}
Jayakrishnan
źródło
0

Ponieważ nie zostało to jeszcze wspomniane, sposobem na to w sposób zgodny z poprzednimi wersjami byłoby użycie klasy narzędziowej HtmlCompat i po prostu wywołanie (z 0, jeśli nie potrzebujesz żadnych określonych flag)

HtmlCompat.from(inputString, 0).toString()

Pod maską już wykonuje za Ciebie wszystkie wymagane testy API

if (Build.VERSION.SDK_INT >= 24) {
   return Html.fromHtml(source, flags);
}
return Html.fromHtml(source);

Więc dla wejścia

<a href="https://www.stackoverflow.com">Click me!</a>

otrzymasz tylko ciąg „Kliknij mnie!” jako wyjście.

Hrafn
źródło