Как убрать или убрать HTML-теги в Android - PullRequest
72 голосов
/ 28 июня 2011

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

Есть ли у Android способ выхода из HTML?

Ответы [ 7 ]

223 голосов
/ 12 сентября 2011

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

12 голосов
/ 07 июля 2016

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

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

Html.fromHtml(htmltext).toString()

Таким образом, HTML-тег будет заменен на строку, но строка не будет правильно отформатирована. Следовательно, я сделал

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

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

9 голосов
/ 17 сентября 2015

В качестве альтернативы можно использовать 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 голосов
/ 08 июня 2018

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 в простой текст?

3 голосов
/ 26 января 2017

Это для альтернативы новому методу (API 16 +):

android.text.Html.escapeHtml(your_html).toString();
2 голосов
/ 15 ноября 2016
 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());
1 голос
/ 10 июля 2017

Это очень просто с jsoup

public static String html2text(String html) {
   return Jsoup.parse(html).text();
}
...