Как убрать или убрать HTML-теги в Android
PHP имеет strip_tags
функция, которая удаляет теги HTML и PHP из строки.
Есть ли у Android способ избежать HTML?
8 ответов
Решения в ответе, на которые ссылается @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();
}
}
Это использует встроенный в Html парсер Android для создания Spanned
представление входного HTML без каких-либо тегов HTML. Разметка "Span" затем удаляется путем преобразования вывода обратно в строку.
Как обсуждалось здесь, поведение Html.fromHtml изменилось со времени Android N. См. Документацию для получения дополнительной информации.
Извините за поздний пост, но я думаю, что это может помочь другим,
Чтобы просто удалить полосы 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);
}
}
}
}
Я использую этот класс, который работает нормально.
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 в обычный текст?
Это для новой альтернативы метода (API 16+):
android.text.Html.escapeHtml(your_html).toString();
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>
вы получите только строку «Нажми меня!» как вывод.