wake-up-neo.net

Wie kann ich HTML-Tags aus einem String in ASP.NET entfernen?

Wie kann ich mithilfe von ASP.NET die HTML-Tags zuverlässig aus einer bestimmten Zeichenfolge entfernen (d. H. Keine Regex verwenden)? Ich suche so etwas wie PHP strip_tags.

Beispiel:

<ul><li>Hello</li></ul>

Ausgabe:

"Hallo"

Ich versuche das Rad nicht neu zu erfinden, aber bisher habe ich nichts gefunden, was meinen Bedürfnissen entspricht.

118
daniel

Wenn nur all HTML-Tags aus einem String entfernt werden, funktioniert dies auch mit Regex zuverlässig. Ersetzen:

<[^>]*(>|$)

mit der leeren Zeichenfolge, global. Vergessen Sie nicht, die Zeichenfolge anschließend zu normalisieren, indem Sie Folgendes ersetzen:

[\s\r\n]+

mit einem einzigen Leerzeichen und Trimmen des Ergebnisses. Ersetzen Sie optional alle HTML-Zeichenelemente wieder in die tatsächlichen Zeichen.

Hinweis

  1. Es gibt eine Einschränkung: HTML und XML erlauben > in Attributwerten. Diese Lösung will gibt ein defektes Markup zurück, wenn solche Werte gefunden werden.
  2. Die Lösung ist technisch sicher wie in: Das Ergebnis wird niemals irgendetwas enthalten, das zum Cross-Site-Scripting oder zum Brechen eines Seitenlayouts verwendet werden könnte. Es ist einfach nicht sehr sauber.
  3. Wie bei allen Dingen HTML und Regex:
    Verwenden Sie einen richtigen Parser , wenn Sie es unter allen Umständen richtig machen müssen.
104
Tomalak

Jetzt HTMLAgilityPack herunterladen! ;) Download-Link

Dadurch können Sie HTML laden und analysieren. Dann können Sie im DOM navigieren und die inneren Werte aller Attribute extrahieren. Im Ernst, es werden maximal 10 Zeilen Code benötigt. Es ist eine der größten kostenlosen .net-Bibliotheken.

Hier ist ein Beispiel:

            string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd();

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlContents);
            if (doc == null) return null;

            string output = "";
            foreach (var node in doc.DocumentNode.ChildNodes)
            {
                output += node.InnerText;
            }
70
Serapth
Regex.Replace(htmlText, "<.*?>", string.Empty);
62
user95144
protected string StripHtml(string Txt)
{
    return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty);
}    

Protected Function StripHtml(Txt as String) as String
    Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty)
End Function
11
meramez

Ich habe dies in den asp.net-Foren gepostet, und es scheint immer noch eine der einfachsten Lösungen zu sein. Ich kann nicht garantieren, dass es am schnellsten oder effizientesten ist, aber es ist ziemlich zuverlässig. In .NET können Sie die HTML-Web-Control-Objekte selbst verwenden. Alles, was Sie wirklich tun müssen, ist, Ihren String in ein temporäres HTML-Objekt wie ein DIV einzufügen und dann den eingebauten 'InnerText' zu verwenden, um den gesamten Text zu übernehmen, der nicht in Tags enthalten ist. Nachfolgend finden Sie ein einfaches C # -Beispiel:


System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;
6
Michael Tipton

Ich habe eine ziemlich schnelle Methode in c # geschrieben, die der Regex die Hölle übertrifft. Es wird in einem Artikel über CodeProject gehostet.

Seine Vorteile sind unter anderem die bessere Leistung benannter und nummerierter HTML-Entitäten (z. B. &amp;amp; und &203;) sowie der Ersatz von Kommentarblöcken und mehr.

Bitte lesen Sie den Artikel über CodeProject .

Vielen Dank.

5
Andrei Rînea

Für diejenigen unter Ihnen, die das HtmlAgilityPack nicht verwenden können, ist der .NET-XML-Reader eine Option. Dies kann bei gut formatiertem HTML-Code fehlschlagen, fügen Sie also immer einen Haken mit regx als Backup hinzu. Beachten Sie, dass dies NICHT schnell ist, aber es bietet eine gute Gelegenheit für den alten Schulschritt durch Debugging.

public static string RemoveHTMLTags(string content)
    {
        var cleaned = string.Empty;
        try
        {
            StringBuilder textOnly = new StringBuilder();
            using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>")))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Text)
                        textOnly.Append(reader.ReadContentAsString());
                }
            }
            cleaned = textOnly.ToString();
        }
        catch
        {
            //A tag is probably not closed. fallback to regex string clean.
            string textOnly = string.Empty;
            Regex tagRemove = new Regex(@"<[^>]*(>|$)");
            Regex compressSpaces = new Regex(@"[\s\r\n]+");
            textOnly = tagRemove.Replace(content, string.Empty);
            textOnly = compressSpaces.Replace(textOnly, " ");
            cleaned = textOnly;
        }

        return cleaned;
    }
4
Bucket
string result = Regex.Replace(anytext, @"<(.|\n)*?>", string.Empty);
3
Ahmet BUTUN

Für diejenigen, die sich darüber beklagen, dass die Lösung von Michael Tiptop nicht funktioniert, ist die .Net4 + - Methode:

public static string StripTags(this string markup)
{
    try
    {
        StringReader sr = new StringReader(markup);
        XPathDocument doc;
        using (XmlReader xr = XmlReader.Create(sr,
                           new XmlReaderSettings()
                           {
                               ConformanceLevel = ConformanceLevel.Fragment
                               // for multiple roots
                           }))
        {
            doc = new XPathDocument(xr);
        }

        return doc.CreateNavigator().Value; // .Value is similar to .InnerText of  
                                           //  XmlDocument or JavaScript's innerText
    }
    catch
    {
        return string.Empty;
    }
}
1
Annie

Für den zweiten Parameter, d.h. Behalten Sie einige Tags. Möglicherweise benötigen Sie Code wie HTMLagilityPack:

public string StripTags(HtmlNode documentNode, IList keepTags)
{
    var result = new StringBuilder();
        foreach (var childNode in documentNode.ChildNodes)
        {
            if (childNode.Name.ToLower() == "#text")
            {
                result.Append(childNode.InnerText);
            }
            else
            {
                if (!keepTags.Contains(childNode.Name.ToLower()))
                {
                    result.Append(StripTags(childNode, keepTags));
                }
                else
                {
                    result.Append(childNode.OuterHtml.Replace(childNode.InnerHtml, StripTags(childNode, keepTags)));
                }
            }
        }
        return result.ToString();
    }

Weitere Informationen zu dieser Seite: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-htht-in-c-strip_html-php-equivalent/

0
Yuksel Daskin

Ich habe mir die hier vorgeschlagenen Lösungen von Regex angesehen, und sie geben mir kein Vertrauen, außer in den trivialsten Fällen. Eine spitze Klammer in einem Attribut genügt, um zu brechen, geschweige denn falsch formatiertes HTML aus der Wildnis. Und was ist mit Entitäten wie &amp;? Wenn Sie HTML in einfachen Text konvertieren möchten, müssen Sie auch Entitäten dekodieren.

Also schlage ich die Methode unten vor.

Mit HtmlAgilityPack entfernt diese Erweiterungsmethode effizient alle HTML-Tags aus einem HTML-Fragment. Dekodiert auch HTML-Entitäten wie &amp;. Gibt nur die inneren Textelemente mit einer neuen Zeile zwischen jedem Textelement zurück.

public static string RemoveHtmlTags(this string html)
{
        if (String.IsNullOrEmpty(html))
            return html;

        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);

        if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
        {
            return WebUtility.HtmlDecode(html);
        }

        var sb = new StringBuilder();

        var i = 0;

        foreach (var node in doc.DocumentNode.ChildNodes)
        {
            var text = node.InnerText.SafeTrim();

            if (!String.IsNullOrEmpty(text))
            {
                sb.Append(text);

                if (i < doc.DocumentNode.ChildNodes.Count - 1)
                {
                    sb.Append(Environment.NewLine);
                }
            }

            i++;
        }

        var result = sb.ToString();

        return WebUtility.HtmlDecode(result);
}

public static string SafeTrim(this string str)
{
    if (str == null)
        return null;

    return str.Trim();
}

Wenn Sie es wirklich ernst meinen, sollten Sie auch den Inhalt bestimmter HTML-Tags ignorieren (<script>, <style>, <svg>, <head>, <object>), da sie wahrscheinlich keinen lesbaren Inhalt in dem Sinne enthalten, in dem wir danach sind. Was Sie dort tun, hängt von Ihren Umständen und davon ab, wie weit Sie gehen möchten. Mit HtmlAgilityPack wäre es jedoch ziemlich trivial, ausgewählte Tags auf die Whitelist oder Blacklist zu setzen.

Wenn Sie den Inhalt wieder in eine HTML-Seite rendern, stellen Sie sicher, dass Sie die XSS-Schwachstelle & verstehen, wie Sie sie verhindern können - dh kodieren Sie jeden vom Benutzer eingegebenen Text, der auf einer HTML-Seite wiedergegeben wird (> wird zu &gt; usw.) .

0
saille
using System.Text.RegularExpressions;

string str = Regex.Replace(HttpUtility.HtmlDecode(HTMLString), "<.*?>", string.Empty);
0
Karan