在Android HtmlCompat.fromHtml()创建Spanned之后如何停止显示JavaScript的EditText

问题描述 投票:0回答:1

我的视图中有一个EditText。我正在使用HtmlCompat.fromHtml()在此EditText中显示电子邮件的内容,以便可以对其进行查看和编辑。如果html包含任何JavaScript,那么它将在生成的Spanned中呈现。

如果我有以下(示例)代码:

String htmlString = "<html>\n" +
    "\n" +
    "<head>\n" +
    "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n" +
    "    <script type=\"text/javascript\">\n" +
    "        alert(\"This should not appear in the EditText\");\n" +
    "    </script>\n" +
    "</head>\n" +
    "\n" +
    "<body style=\"margin: 0;padding: 0;box-sizing: border-box;-webkit-font-smoothing: antialiased;-webkit-text-size-adjust: none;width: 100% !important;height: 100% !important;line-height: 1.6;margin-top: 0 !important;margin-left: 0 !important;margin-right: 0 !important\" class=\"\">\n" +
    "    <div dir=\"auto\">Technician booked for tomorrow morning\n" +
    "        <br>\n" +
    "        <br>\n" +
    "    </div>\n" +
    "    <div dir=\"auto\">\n" +
    "        <a href=\"http://www.bluemail.me/r?b=15726\"></a>\n" +
    "    </div>\n" +
    "</body>\n" +
    "\n" +
    "</html>";

emailTextView.setText(HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT));

然后EditText显示<script type=\"text/javascript\">alert(\"This should not appear in the EditText\");</script>的内容,我希望可以将其删除/隐藏。但我得到:

screen shot showing the issue

有什么方法可以阻止这种情况,或者还有其他方法可以使EditText中呈现的电子邮件中的HTML进行编辑?我知道Gmail可以在Android上做到这一点,但看不到它是如何做到的?

java android android-edittext
1个回答
0
投票

<script>whatever</script>被剥夺,将“一切”保留在原处。这是HtmlCompat.fromHtml()对于无法识别的标签的默认行为。在调用HtmlCompat.fromHtml()之前,您将需要从字符串中剥离问题标记和关联的文本。您可以使用直字符串匹配或正则表达式来执行此操作。

对于Java:

String newString =  mHtmlString.replaceAll("(?is)<script.*?</script>","")

对于Kotlin:

val newString = mHtmlString.replace(Regex("(?is)<script.*?</script>"), "")

第二种方法是使用您可以在对[[fromHtml(String,int,ImageGetter,TagHandler)的调用中指定的标记处理程序。

override fun handleTag( opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader? ) { class DeleteSpan if (!tag.equals("script", true)) { return } if (opening) { output.setSpan(DeleteSpan(), output.length, output.length, Spannable.SPAN_MARK_MARK) } else { val spans = output.getSpans(0, output.length, DeleteSpan::class.java) val lastSpan = spans[spans.size - 1] output.apply { delete(getSpanStart(lastSpan), length) removeSpan(lastSpan) } } }
第二种方法只是从输出中删除脚本标签的内容。
© www.soinside.com 2019 - 2024. All rights reserved.