我的视图中有一个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>
的内容,我希望可以将其删除/隐藏。但我得到:
有什么方法可以阻止这种情况,或者还有其他方法可以使EditText中呈现的电子邮件中的HTML进行编辑?我知道Gmail可以在Android上做到这一点,但看不到它是如何做到的?
<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)
}
}
}
第二种方法只是从输出中删除脚本标签的内容。