如何在 Android 中剥离或转义 html 标签

PHP 有 strip_tags函数,它从字符串中去除 HTML 和 PHP 标记。

Android 有逃脱 html 的方法吗?

62717 次浏览

通常情况下,这个问题的解决方案要么需要正则表达式(这是一种容易出错的方法) ,要么需要安装第三方库,比如 Jericho。在 Android 设备上,一个更好的解决方案是使用 Html.from Html ()函数:

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 解析器来构建输入 Html 的 Spanned表示,而不使用任何 Html 标记。然后,通过将输出转换回字符串来剥离“ Span”标记。

如前所述,从 Android N 开始,Html.from Html 的行为已经发生了变化,更多信息请参见 文件

如果您的目标是 API 16或更高,您也可以选择使用 Html.escapeHtml(String)

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

我使用的这个类工作得很好。

很抱歉这么晚才发布,但我想这对其他人也许有帮助,

删除 html 条

Html.fromHtml(htmltext).toString()

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

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

这样我首先用下一行替换空格,然后删除空格。同样你也可以删除其他空格。

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

这是针对新方法的替代方案(API 16 +) :

android.text.Html.escapeHtml(your_html).toString();

这是非常简单的

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

From Html 对于大的 html 字符串来说可能非常慢。

下面是使用 jsoup 可以做到这一点的方法,它既简单又快捷:

将这一行添加到你的等级文件中:

implementation 'org.jsoup:jsoup:1.11.3'

点击这里查看最新的 jsoup 版本: Https://jsoup.org/download

将这一行添加到代码中:

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

点击这里了解如何保持换行符:

如何保持断行时,使用 jsoup 转换 HTML 为纯文本?

因为还没有提到,所以以向后兼容的方式完成这项工作的方法是使用 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>

您将只收到字符串“ Click me!”作为输出。