使用白名单清理html并在白名单元素上保留一些属性

时间:2017-10-24 21:17:52

标签: java scala jsoup

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编写的答案没有问题。

1 个答案:

答案 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")