代码之家  ›  专栏  ›  技术社区  ›  shayan

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

  •  1
  • shayan  · 技术社区  · 8 年前

    下面的代码段 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)
    

    direction css属性或可能的 dir 属性。

    我对用java编写的答案没有问题。

    1 回复  |  直到 8 年前
        1
  •  1
  •   shayan    8 年前

    我通过将不安全的文本传递给如下自定义递归方法来解决这个问题:

    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")
    
    推荐文章