2010-01-06 19 views
5

Meine C# -Site ermöglicht Benutzern, HTML zu übermitteln, um auf der Website angezeigt zu werden. Ich möchte die Tags und Attribute beschränken, die für den HTML-Code zulässig sind, bin aber nicht in der Lage, herauszufinden, wie dies in .net funktioniert.Saubere Benutzer HTML in .net

Ich habe versucht mit Html Agility Pack, aber ich sehe nicht, wie man den HTML ändern kann, kann ich sehen, wie man durch den HTML gehen und bestimmte Daten finden, aber tatsächlich eine Ausgabedatei erzeugt, ist verwirrend.

Hat jemand ein gutes Beispiel für die Bereinigung von HTML in .net? Das Agilitätspaket könnte die Antwort sein, aber die Dokumentation fehlt.

+0

Gute Frage. Dies ist ganz oben auf meiner Liste, wenn ich HTML-Code übergebe und anzeigen lasse - im Allgemeinen verwende ich Steuerelemente, die das Ergebnis für mich formatieren und bereinigen (zB www.freetextbox.com in ASP.NET), aber ich sollte das Ergebnis wirklich bestätigen auch. +1 für die Frage. – Codesleuth

Antwort

2

Mit HtmlAgilityPack Sie unerwünschte Tags aus dem Eingang entfernen:

node.ParentNode.RemoveChild(node); 
+0

Das ist die Methode, nach der ich gesucht habe. Vielen Dank. – spaetzel

3

Sie sollten nur wohlgeformtes HTML akzeptieren.

Sie können dann LINQ to XML zum Parsen und Ändern verwenden.

Sie können eine rekursive Funktion erstellen, die ein Element vom Benutzer übernimmt und ein neues Element mit einem weißen Satz von Tags und Attributen zurückgibt.

Zum Beispiel:

//Maps allowed tags to allowed attributes for the tags. 
static readonly Dictionary<string, string[]> AllowedTags = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase) { 
    { "b", new string[0] }, 
    { "img", new string[] { "src", "alt" } }, 
    //... 
}; 
static XElement CleanElement(XElement dirtyElement) { 
    return new XElement(dirtyElem.Name, 
     dirtyElement.Elements 
      .Where(e => AllowedTags.ContainsKey(e.Name)) 
      .Select<XElement, XElement>(CleanElement) 
      .Concat(
       dirtyElement.Attributes 
        .Where(a => AllowedTags[dirtyElem.Name].Contains(a.Name, StringComparer.OrdinalIgnoreCase)) 
      ); 
} 

Wenn Sie erlauben, Hyperlinks, stellen Sie sicher, javascript: Urls nicht zuzulassen; Dieser Code macht das nicht.

+0

+1 Schön - ich mag den "hausgebrauten" Ansatz. –

0

Ein Werkzeug Sie verwenden können, ist verfügbar ab der Source SGMLReader ist, die den HTML-Code in richtig formatiert XML dreht sich um und ermöglicht es Ihnen, es zu lesen, wie ein XmlReader oder laden Sie es zur weiteren Verarbeitung in ein XmlDocument-Objekt. Ich habe das schon mal zum Parsen von Webseiten benutzt, die nicht immer in richtig formatiertem HTML sind.

0

Habt ihr einen Blick auf MarkdownSharp geworfen, die Open Source ist und von den Jungs hier erstellt wurde?