PHP hat eine strip_tags
Funktion, die HTML- und PHP-Tags von einer Zeichenfolge entfernt.
Hat Android eine Möglichkeit, sich HTML zu entziehen?
Antworten:
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 Spanned
Darstellung 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 .
Html.escapeHtml(String)
wenn Sie die Tags nur maskieren möchten, ohne sie zu entfernen.
Html.fromHtml(html).toString();
mehrere Leerzeichen entfernt werden, was nicht immer eine gute Wahl ist.
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.
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("<");
} 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);
}
}
}
}
Ich benutze diese Klasse, die gut funktioniert.
Dies gilt für eine neue Methodenalternative (API 16+):
android.text.Html.escapeHtml(your_html).toString();
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?
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());
Mit jsoup ist das ganz einfach
public static String html2text(String html) {
return Jsoup.parse(html).text();
}
Html.fromHtml(String)
Rückgabe einer erweiterten Klasse vonCharSequence
. Sie können es also direkt mit Methoden verwenden, dieCharSequence
Parameter akzeptieren , ohne sie aufzurufentoString()
. Danke Nick für die tolle Antwort :-)