83

PHP 具有strip_tags从字符串中去除 HTML 和 PHP 标记的功能。

Android有办法转义html吗?

4

8 回答 8

244

@sparkymat 链接的答案中的解决方案通常需要正则表达式(这是一种容易出错的方法)或安装第三方库,例如jsoupjericho。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 以来发生了变化。有关更多信息,请参阅文档

于 2011-09-12T14:43:59.500 回答
15

对不起,迟到的帖子,但我认为这可能对其他人有所帮助,

只需删除 html 条

Html.fromHtml(htmltext).toString()

这样 html 标签将被替换为字符串,但字符串的格式将不正确。因此我做到了

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

这样我首先用空格替换下一行并删除空格。同样,您可以删除其他人。

于 2016-07-07T09:10:44.820 回答
12

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);
            }
        }
    }
}

我正在使用这个工作正常的类。

于 2015-09-17T00:33:16.020 回答
4

这是用于新方法替代(API 16+):

android.text.Html.escapeHtml(your_html).toString();
于 2017-01-26T06:30:33.277 回答
4

对于大型 html 字符串,Html.fromHtml 可能会非常慢。

以下是使用 jsoup 轻松快速地做到这一点的方法:

将此行添加到您的 gradle 文件中:

implementation 'org.jsoup:jsoup:1.11.3'

在此处查看最新的 jsoup 版本: https ://jsoup.org/download

将此行添加到您的代码中:

String text = Jsoup.parse(htmlStr).text();

在此处查看此链接以了解如何保留换行符:

使用jsoup将html转换为纯文本时如何保留换行符?

于 2018-06-08T18:54:59.327 回答
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());
于 2016-11-15T07:18:03.113 回答
2

这对jsoup来说非常简单

public static String html2text(String html) {
   return Jsoup.parse(html).text();
}
于 2017-07-10T10:29:41.293 回答
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>

您将只收到字符串“点击我!” 作为输出。

于 2021-01-06T16:54:22.640 回答