PHP має strip_tags
функцію, яка видаляє теги HTML і PHP із рядка.
Чи є у Android спосіб уникнути html?
Відповіді:
Рішення у відповіді , пов'язаний з допомогою @sparkymat зазвичай потрібні або регулярний вираз - яке є схильними помилками підходу - або встановлювати сторонні бібліотеки , такі як jsoup або Єрихон . Кращим рішенням для пристроїв 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.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()
. Дякую Ніку за чудову відповідь :-)