PHP имеет strip_tags
функция, которая удаляет теги HTML и PHP из строки.
Есть ли у Android способ избежать HTML?
Ответы:
Решения в ответе, на которые ссылается @sparkymat, обычно требуют либо регулярного выражения, что подвержено ошибкам, либо установки сторонней библиотеки, такой как jsoup или jericho . Лучшее решение на устройствах Android - просто использовать функцию 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();
}
}
При этом используется встроенный в Android парсер Html для создания Spanned
представления входного HTML без каких-либо тегов HTML. Затем разметка «Span» удаляется путем преобразования вывода обратно в строку.
Как обсуждалось здесь , поведение Html.fromHtml изменилось с момента выхода Android N. Дополнительные сведения см. В документации .
Html.escapeHtml(String)
если хотите избежать тегов, не удаляя их.
Html.fromHtml(html).toString();
удаляет несколько пробелов, что не всегда является хорошим выбором.
Извините за поздний пост, но я думаю, что это может помочь другим,
Чтобы просто удалить полосы html
Html.fromHtml(htmltext).toString()
Таким образом, тег html будет заменен строкой, но строка не будет отформатирована должным образом. Следовательно, я сделал
Html.fromHtml(htmltext).toString().replaceAll("\n", "").trim()
Таким образом, я сначала заменяю на следующую строку пробелом и удаляю пробел. Точно так же вы можете удалить других.
Вы также можете использовать Html.escapeHtml(String)
если ориентируетесь на API 16 или выше.
Для таргетинга ниже API 16 вы можете вместо этого использовать класс ниже, вызвав HtmlUtils.escapeHtml(String)
который я просто извлек из источника 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);
}
}
}
}
Я использую этот класс, который отлично работает.
Это для новой альтернативы метода (API 16+):
android.text.Html.escapeHtml(your_html).toString();
Html.fromHtml может быть очень медленным для больших HTML-строк.
Вот как это можно сделать легко и быстро с помощью jsoup:
Добавьте эту строку в свой файл gradle:
implementation 'org.jsoup:jsoup:1.11.3'
Проверьте, какая последняя версия jsoup здесь: https://jsoup.org/download
Добавьте эту строку в свой код:
String text = Jsoup.parse(htmlStr).text();
Перейдите по этой ссылке, чтобы узнать, как сохранить разрывы строк:
Как сохранить разрывы строк при использовании jsoup для преобразования HTML в обычный текст?
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());
Это очень просто с jsoup
public static String html2text(String html) {
return Jsoup.parse(html).text();
}
Как еще не упоминалось, способ сделать это обратно совместимым способом - использовать служебный класс HtmlCompat и просто вызвать (с 0, если вам не нужно использовать определенные флаги)
HtmlCompat.from(inputString, 0).toString()
Под капотом он уже выполняет все необходимые проверки API за вас.
if (Build.VERSION.SDK_INT >= 24) {
return Html.fromHtml(source, flags);
}
return Html.fromHtml(source);
Итак, для ввода
<a href="https://www.stackoverflow.com">Click me!</a>
вы получите только строку «Нажми меня!» как выход.
Html.fromHtml(String)
возвращение расширенного классаCharSequence
. Таким образом, вы можете использовать его напрямую с методами, принимающимиCharSequence
параметры, без вызоваtoString()
. Спасибо Нику за отличный ответ :-)