8

HTMLを含む可能性のある特定のテキストをフィルタリングしたいという問題があります。私は jsoup を使ってタグをホワイトリストに登録し、きれいにしています。

一部のタグに属性、主にスタイルまたはクラスを含めることができるという問題しかありませんが、異なる属性も存在する可能性があります。(名前、ターゲットなど) きれいにするときは問題ありません。なぜならそれらはきれいに削除されるからです。基本的なホワイトリストは、スタイルやクラスの属性をカバーしていないようです。さらに、他に何が発生しているのかわかりません。

非常に幅広いタグを許可したいが、クリーニング中にそれらのほとんどを削除したいので、許可しているすべてのタグにすべての属性を追加したくありません。とにかく興味がないので、最も簡単な方法は、すべてのタグからすべての属性を削除し、プレーンタグで削除されたテキストが有効かどうかを確認することです。

すべての属性またはいくつかの単純なループを削除する機能はありますか。別のオプションは、ホワイトリスターにすべての属性を無視し、単にタグをホワイトリストに登録するように指示することです。

4

1 に答える 1

24

最終的に私のために働いた解決策は非常に簡単です。すべての要素を繰り返し処理し、次にすべての属性を繰り返し処理してから、要素の属性を削除します。これにより、html タグ自体を検証するだけでクリーンなバージョンが残ります。これは問題を解決するための最もきちんとした方法ではないと思いますが、私が望んでいたことを行います。

** 編集 **

古いコードには何度も賛成票が投じられましたが、実際には絶対的な初心者向けのバグが含まれていました。同じリストを繰り返し処理している間は決して削除できません。ただし、このバグは、複数の属性が削除された場合にのみトリガーされます。

バグ修正で更新されたコード:

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 に答える