8

我有一个问题,我想过滤某些可能包含 html 的文本。我使用 jsoup 将标签列入白名单并清理效果很好。

我只有一些标签可以包含属性的问题,主要是样式或类,但也可能有不同的属性。(名称,目标等。)清理时这没问题,因为它们被很好地剥离,但是当将一些允许的标签列入白名单时,由于属性而被阻止。基本的白名单似乎没有涵盖样式或类属性,而且我不能确定我还遇到了什么。

由于我想允许相当广泛的标签,但在清理过程中删除大部分标签,我不想为我允许的所有标签添加所有属性。最简单的方法是从所有标签中删除所有属性,因为无论如何我对它们都不感兴趣,然后检查带有纯标签的剥离文本是否有效。

是否有删除所有属性或一些简单循环的功能,另一种选择是告诉白名单者忽略所有属性并简单地将标签列入白名单。

4

1 回答 1

24

最终对我有用的解决方案非常简单。我遍历所有元素,然后遍历所有属性,然后在元素上删除它们,这给我留下了一个干净的版本,我只需要验证 html-tags 本身。我认为这不是解决问题的最佳方法,但它可以满足我的要求。

** 编辑 **

我为旧代码多次投票,而它实际上包含一个绝对的初学者错误。遍历同一个列表时永远不能删除。但是,仅当删除多个属性时才会触发此错误。

使用错误修复更新代码:

Document doc = Jsoup.parseBodyFragment(aText);
Elements el = doc.getAllElements();
for (Element e : el) {
    List<String>  attToRemove = new ArrayList<>();
    Attributes at = e.attributes();
    for (Attribute a : at) {
        // transfer it into a list -
        // to be sure ALL data-attributes will be removed!!!
        attToRemove.add(a.getKey());
    }

    for(String att : attToRemove) {
        e.removeAttr(att);
   }
}


return Jsoup.isValid(doc.body().html(), theLegalWhitelist);
于 2013-08-15T07:27:48.890 回答