2013-08-14 11 views
6

Ich habe das Problem, dass ich bestimmte Texte filtern, die HTML enthalten können. Ich benutze jsoup, um die Tags zu whitelist und zu säubern, was ziemlich gut funktioniert.Jsoup Attribut Entfernung auf HTML-Tags

Ich habe nur das Problem, dass einige der Tags Attribute enthalten können, meist Stil oder Klassen, aber es könnte auch andere Attribute geben. (Name, Ziel, ect.) Bei der Säuberung ist das kein Problem, weil sie schön entfernt werden, aber beim Whitelisting werden einige Tags, die erlaubt wären, wegen der Attribute blockiert. Die grundlegende Whitelist scheint keine Stil- oder Klassenattribute abzudecken, und ich kann nicht sicher sein, was ich sonst noch treffe.

Da ich eine breite Palette von Tags zulassen möchte, aber die meisten davon während der Reinigung entfernen, möchte ich nicht alle Attribute für alle Tags hinzufügen, die ich erlaube. Am einfachsten wäre es, alle Attribute von allen Tags zu entfernen, da ich mich sowieso nicht für sie interessiere und dann überprüfe, ob der gestrippte Text mit den einfachen Tags gültig ist.

Gibt es eine Funktion, die alle Attribute oder eine einfache Schleife entfernt, wäre eine andere Option, dem Whitelist mitzuteilen, alle Attribute zu ignorieren und einfach die Tags auf die Whitelist zu setzen.

+0

Verwandte: http://stackoverflow.com/questions/14303691/why-does-jsoup-remove-element-ids/14303971#14303971 –

Antwort

13

Die Lösung, die schließlich für mich funktionierte, ist ziemlich einfach. Ich iteriere durch alle Elemente, iteriere dann durch alle Attribute und entferne sie dann auf dem Element, was mir eine saubere Version gibt, in der ich nur die html-Tags validieren muss. Ich denke, das ist nicht der beste Weg, um das Problem zu lösen, aber es tut, was ich wollte.

** EDIT **

habe ich viele Male für den alten Code upvoted, während es tatsächlich einen absoluten Anfänger Fehler enthalten. Sie können niemals löschen, während Sie die gleiche Liste durchlaufen. Dieser Fehler wurde jedoch nur ausgelöst, wenn mehr als ein Attribut entfernt wurde.

upadted Code mit Bugfix

Document doc = Jsoup.parseBodyFragment(aText); 
Elements el = doc.getAllElements(); 
List<String> attToRemove = new ArrayList<>(); 
for (Element e : el) { 
    Attributes at = e.attributes(); 
    for (Attribute a : at) { 
     attToRemove.add(a.getKey()); 
    } 

    for(String att : attToRemove) { 
     e.removeAttr(att); 
    } 
} 
if(Jsoup.isValid(doc.body().html(), theLegalWhitelist)) 
    return true; 
else 
    return false;