scala
下面使用Jsoup
的代码片段允许我从任何html标记中清除字符串,但白名单中明确的除外:
val whiteList = Whitelist.none().addTags(
"b", "br", "ul", "ol", "li", "em", "h4", "h5", "hr", "pre", "sub", "sup"
)
Jsoup.clean("some unsafe text", whiteList)
该过程不加选择地从文本内部的标签中剥离所有css样式和元素属性,这是一般情况所需的。但我想要的是让进程在白名单的块元素上保留direction
css属性或可能dir
属性。
我用java编写的答案没有问题。
答案 0 :(得分:1)
我通过将不安全的文本传递给这样的自定义递归方法来解决它:
val whiteList = List(
"b", "br", "ul", "ol", "li", "em", "h4", "h5", "hr", "pre", "sub", "sup"
)
def clean(raw: String): String = {
def traverseAndClean(elem: Element): Unit = {
if (!whiteList.contains(elem.tagName())) {
elem.remove()
} else {
elem.attributes().forEach { attr =>
val key = attr.getKey
if (key != "dir") elem.removeAttr(key)
}
elem.children().iterator().forEachRemaining(traverseAndClean)
}
}
val doc = Jsoup.parseBodyFragment(raw)
doc.body().children().iterator().forEachRemaining(traverseAndClean)
doc.body().html()
}
clean("my unsafe text")