【问题标题】:How to strip or escape html tags in Android如何在 Android 中剥离或转义 html 标签
【发布时间】:2011-09-24 01:41:19
【问题描述】:

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

Android 有办法转义 html 吗?

【问题讨论】:

    标签: android strip-tags


    【解决方案1】:

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

    正如 here 所讨论的,Html.fromHtml 行为自 Android N 以来发生了变化。有关详细信息,请参阅 documentation

    【讨论】:

    • 另外请注意Html.fromHtml(String) 返回一个扩展类CharSequence。因此,您可以直接将其与接受CharSequence 参数的方法一起使用,而无需调用toString()。感谢尼克的精彩回答:-)
    • 如果您只想转义标签而不删除它们,也可以使用Html.escapeHtml(String)
    • 我认为 Html.fromHtml(String) 方法的标签支持集有限
    • 我的 html 头部有 html> 这也没有得到处理。请帮忙
    • 请注意,Html.fromHtml(html).toString(); 会删除多个空格,这并不总是一个好的选择。
    【解决方案2】:

    抱歉,帖子迟了,但我认为这可能对其他人有所帮助,

    仅删除 html 条

    Html.fromHtml(htmltext).toString()
    

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

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

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

    【讨论】:

    【解决方案3】:

    如果您的目标是 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);
                }
            }
        }
    }
    

    我正在使用这个类,效果很好。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        implementation 'org.jsoup:jsoup:1.11.3'
        

        在这里查看最新的 jsoup 版本是什么: https://jsoup.org/download

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

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

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

        How do I preserve line breaks when using jsoup to convert html to plain text?

        【讨论】:

          【解决方案6】:
           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());
          

          【讨论】:

            【解决方案7】:

            jsoup 非常简单

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

            【讨论】:

              【解决方案8】:

              尚未提及,以向后兼容的方式执行此操作的方法是使用HtmlCompat utility class,然后简单地调用(如果您不需要使用特定标志,则使用 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>
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-07-11
                • 1970-01-01
                • 2010-10-24
                • 2016-11-14
                • 2014-07-31
                • 2018-01-18
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多