PHP ma strip_tags
funkcję, która usuwa znaczniki HTML i PHP z ciągu znaków.
Czy Android ma sposób na uniknięcie HTML?
źródło
PHP ma strip_tags
funkcję, która usuwa znaczniki HTML i PHP z ciągu znaków.
Czy Android ma sposób na uniknięcie HTML?
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ć Spanned
reprezentację 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 .
Html.fromHtml(String)
zwrócić rozszerzoną klasęCharSequence
. Możesz więc używać go bezpośrednio z metodami akceptującymiCharSequence
parametry, bez wywoływaniatoString()
. Dzięki Nick za świetną odpowiedź :-)Html.escapeHtml(String)
jeśli chcesz po prostu uciec od tagów bez ich usuwania.Html.fromHtml(html).toString();
usuwa wiele spacji, co nie zawsze jest dobrym wyborem.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.
źródło
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łaHtml.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("<"); } else if (c == '>') { out.append(">"); } else if (c == '&') { out.append("&"); } 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(" "); i++; } out.append(' '); } else { out.append(c); } } } }
Używam tej klasy, która działa dobrze.
źródło
Dotyczy to nowej metody alternatywnej (API 16+):
android.text.Html.escapeHtml(your_html).toString();
źródło
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?
źródło
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());
źródło
To jest banalnie proste w przypadku jsoup
public static String html2text(String html) { return Jsoup.parse(html).text(); }
źródło
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.
źródło