PHP имеет функцию strip_tags
, которая удаляет теги HTML и PHP из строки.
Есть ли у Android способ избежать html?
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);
} else {
return Html.fromHtml(html);
}
}
Это использует Android, встроенный в парсер Html, для создания Spanned
представления входного html без каких-либо тэгов html. Разметка "Span" затем удаляется путем преобразования вывода обратно в строку.
Как обсуждалось здесь, поведение Html.fromHtml изменилось с Android N. См. документацию для получения дополнительной информации.
В качестве альтернативы вы можете использовать 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-полосы
Html.fromHtml(htmltext).toString()
Таким образом, тег html будет заменен на строку, но строка не будет отформатирована должным образом. Следовательно, я сделал
Html.fromHtml(htmltext).toString().replaceAll("\n", "").trim()
Таким образом, я сначала заменяю следующую строку пробелом и удаляю пустое пространство. Аналогичным образом вы можете удалить других.
Это для новой альтернативы метода (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();
}