Wie kann ich mit ASP.NET die HTML-Tags einer bestimmten Zeichenfolge zuverlässig entfernen (dh keinen regulären Ausdruck verwenden)? Ich suche so etwas wie PHPs strip_tags
.
Beispiel:
<ul><li>Hello</li></ul>
Ausgabe:
"Hallo"
Ich versuche, das Rad nicht neu zu erfinden, aber ich habe bisher nichts gefunden, was meinen Bedürfnissen entspricht.
Antworten:
Wenn nur alle HTML-Tags aus einer Zeichenfolge entfernt werden, funktioniert dies auch mit Regex
zuverlässig. Ersetzen:mit der leeren Zeichenfolge global. Vergessen Sie nicht, die Zeichenfolge anschließend zu normalisieren und zu ersetzen:
mit einem einzigen Leerzeichen und Trimmen des Ergebnisses. Ersetzen Sie optional alle HTML-Zeichenentitäten durch die tatsächlichen Zeichen.
Hinweis :
>
Attributwerte. Diese Lösung gibt bei Auftreten solcher Werte ein fehlerhaftes Markup zurück.Verwenden Sie einen geeigneten Parser, wenn Sie ihn unter allen Umständen richtig machen müssen.
quelle
"e;
. Ich kombiniere esWebUtility.HtmlDecode
damit (was wiederum keine Tags entfernt). Verwenden Sie es nach dem Entfernen des Tags, da es möglicherweise neu geschrieben wird>
und<
. ZBWebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
Laden Sie jetzt HTMLAgilityPack herunter! ;) LInk herunterladen
Auf diese Weise können Sie HTML laden und analysieren. Anschließend können Sie im DOM navigieren und die inneren Werte aller Attribute extrahieren. Im Ernst, Sie benötigen maximal 10 Codezeilen. Es ist eine der größten kostenlosen .net-Bibliotheken da draußen.
Hier ist ein Beispiel:
quelle
text()
Knoten abfragen , den Inhalt und die Zeichenfolge zuschneiden. Fügen Sie diese mit Leerzeichen hinzu.IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
if (doc == null)
Scheck? Das ist immer falsch, nicht wahr?quelle
RegexOptions.SingleLine
.quelle
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 das schnellste oder effizienteste 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, Ihre Zeichenfolge in ein temporäres HTML-Objekt wie ein DIV einzufügen und dann den integrierten 'InnerText' zu verwenden, um den gesamten Text abzurufen, der nicht in Tags enthalten ist. Unten finden Sie ein einfaches C # -Beispiel:
quelle
Ich habe eine ziemlich schnelle Methode in c # geschrieben, die die Hölle aus dem Regex schlägt. Es wird in einem Artikel über CodeProject gehostet.
Seine Vorteile sind neben einer besseren Leistung die Möglichkeit, benannte und nummerierte HTML-Entitäten (wie
&amp;
und&203;
) und das Ersetzen von Kommentarblöcken und mehr zu ersetzen .Bitte lesen Sie den entsprechenden Artikel über CodeProject .
Danke dir.
quelle
Für diejenigen unter Ihnen, die das HtmlAgilityPack nicht verwenden können, ist der XML-Reader von .NET eine Option. Dies kann jedoch bei gut formatiertem HTML fehlschlagen. Fügen Sie daher immer einen Haken mit regx als Backup hinzu. Beachten Sie, dass dies NICHT schnell ist, aber eine gute Gelegenheit für den Schritt der alten Schule durch das Debuggen bietet.
quelle
quelle
Für diejenigen, die sich darüber beschweren, dass die Lösung von Michael Tiptop nicht funktioniert, gibt es hier die .Net4 + -Methode:
quelle
quelle
Ich habe mir die hier vorgeschlagenen Regex-basierten Lösungen angesehen und sie erfüllen mich nur in den trivialsten Fällen mit Vertrauen. Eine spitze Klammer in einem Attribut ist alles, was Sie brauchen, um zu brechen, geschweige denn falsch formuliertes HTML aus der Wildnis. Und was ist mit Entitäten wie
&
? Wenn Sie HTML in einfachen Text konvertieren möchten, müssen Sie auch Entitäten dekodieren.Also schlage ich die folgende Methode vor.
Mit HtmlAgilityPack entfernt diese Erweiterungsmethode effizient alle HTML-Tags aus einem HTML-Fragment. Dekodiert auch HTML-Entitäten wie
&
. Gibt nur die inneren Textelemente mit einer neuen Zeile zwischen den einzelnen Textelementen zurück.Wenn Sie wirklich ernst sind, würden Sie den Inhalt bestimmter HTML - Tags ignorieren zu (
<script>
,<style>
,<svg>
,<head>
,<object>
in den Sinn kommen!) , Weil sie wahrscheinlich lesbaren Inhalt nicht in dem Sinne enthalten sind wir nach. Was Sie dort tun, hängt von Ihren Umständen ab und davon, wie weit Sie gehen möchten. Mit HtmlAgilityPack ist es jedoch ziemlich trivial, ausgewählte Tags auf die Whitelist oder Blacklist zu setzen.Wenn Sie den Inhalt wieder auf eine HTML-Seite rendern, stellen Sie sicher, dass Sie die XSS-Sicherheitsanfälligkeit verstehen und wissen, wie Sie sie verhindern können. Codieren Sie daher immer den vom Benutzer eingegebenen Text, der wieder auf eine HTML-Seite gerendert wird (
>
wird>
usw.).quelle
Für den zweiten Parameter, dh einige Tags behalten, benötigen Sie möglicherweise Code wie diesen, indem Sie HTMLagilityPack verwenden:
Weitere Erläuterungen auf dieser Seite: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/
quelle
Sie können dies auch mit AngleSharp tun, das eine Alternative zu HtmlAgilityPack darstellt (nicht, dass HAP schlecht ist). Es ist einfacher als HAP, den Text aus einer HTML-Quelle zu holen.
Sie können sich den Abschnitt mit den wichtigsten Funktionen ansehen, in dem sie als "besser" als HAP eingestuft werden. Ich denke größtenteils, es ist wahrscheinlich übertrieben für die aktuelle Frage, aber dennoch ist es eine interessante Alternative.
quelle
Einfach benutzen
string.StripHTML();
quelle