Как удалить или избежать тегов HTML в Android


81

PHP имеет strip_tags функция, которая удаляет теги HTML и PHP из строки.

Есть ли у Android способ избежать HTML?

Ответы:


242

Решения в ответе, на которые ссылается @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. Дополнительные сведения см. В документации .


5
Также обратите внимание на Html.fromHtml(String)возвращение расширенного класса CharSequence. Таким образом, вы можете использовать его напрямую с методами, принимающими CharSequenceпараметры, без вызова toString(). Спасибо Нику за отличный ответ :-)

4
Вы также можете использовать, Html.escapeHtml(String)если хотите избежать тегов, не удаляя их.
twaddington

1
Я думаю, что метод Html.fromHtml (String) имеет ограниченный набор поддержки тегов
Hitesh Chavda

1
Моя голова html имеет html> <head> <style> body {font-family: Verdana, sans-serif; размер шрифта: 0.8em; цвет: # 484848; } h1, h2, h3 {семейство шрифтов: "Trebuchet MS", Verdana, sans-serif; маржа: 0px; } h1 {размер шрифта: 1.2em; } h2, h3 {размер шрифта: 1.1em; } a, a: ссылка, a: посетил {color: # 2A5685;} a: hover, a: active {color: # c61a1a; } a.wiki-anchor {дисплей: нет; } час {ширина: 100%; высота: 1 пикс; фон: #ccc; граница: 0; } .footer {размер шрифта: 0.8em; стиль шрифта: курсив; } </style> </head> это тоже не обрабатывается. Пожалуйста, помогите
png

4
Обратите внимание, что Html.fromHtml(html).toString();удаляет несколько пробелов, что не всегда является хорошим выбором.
Бадди

15

Извините за поздний пост, но я думаю, что это может помочь другим,

Чтобы просто удалить полосы html

Html.fromHtml(htmltext).toString()

Таким образом, тег html будет заменен строкой, но строка не будет отформатирована должным образом. Следовательно, я сделал

Html.fromHtml(htmltext).toString().replaceAll("\n", "").trim()

Таким образом, я сначала заменяю на следующую строку пробелом и удаляю пробел. Точно так же вы можете удалить других.


Мне понадобилось 4 слэша. См. Ответ Avis: stackoverflow.com/questions/18865393/…
Heinzlmaen

11

Вы также можете использовать 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("&lt;");
            } else if (c == '>') {
                out.append("&gt;");
            } else if (c == '&') {
                out.append("&amp;");
            } 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("&nbsp;");
                    i++;
                }

                out.append(' ');
            } else {
                out.append(c);
            }
        }
    }
}

Я использую этот класс, который отлично работает.



4

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 в обычный текст?


2
 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());


0

Как еще не упоминалось, способ сделать это обратно совместимым способом - использовать служебный класс 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>

вы получите только строку «Нажми меня!» как выход.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.