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


81

PHP具有strip_tags从字符串中剥离HTML和PHP标签的功能。

Android是否有逃脱html的方法?

Answers:


242

@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.请参阅改变了文档获取更多信息。


5
另外,请注意Html.fromHtml(String)返回的扩展类CharSequence。因此,您可以将其直接用于接受CharSequence参数的方法,而无需调用toString()

4
Html.escapeHtml(String)如果只想转义标签而不删除标签,也可以使用。
twaddington

1
我认为Html.fromHtml(String)方法具有有限的标记支持集
Hitesh Chavda 2015年

1
我的html头有html> <head> <style> body {字体家族:Verdana,无衬线;字号:0.8em;颜色:#484848; } h1,h2,h3 {字体家族:“ Trebuchet MS”,Verdana,无衬线;边距:0px; } h1 {font-size:1.2em; } h2,h3 {font-size:1.1em; } a,a:link,a:visited {color:#2A5685;} a:hover,a:active {color:#c61a1a; } a.wiki-anchor {display:none; }小时{宽度:100%;高度:1px;背景:#ccc; 边界:0; } .footer {font-size:0.8em; 字体样式:斜体;} </ style> </ head>也没有得到处理。请帮助
为png

4
请注意,Html.fromHtml(html).toString();删除多个空格并不总是一个好的选择。
好友

15

不好意思,我认为这对其他人可能会有所帮助,

只需删除html条

Html.fromHtml(htmltext).toString()

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

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

这样,我首先用具有空格的nextline替换并删除了空格。同样,您可以删除其他人。


我需要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);
            }
        }
    }
}

我正在使用这个效果很好的课程。




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>

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.