Wie entferne ich alle HTML-Tags aus einer Zeichenfolge, ohne zu wissen, welche Tags darin enthalten sind?

120

Gibt es eine einfache Möglichkeit, alle HTML-Tags oder ALLES, was mit HTML zu tun hat, aus einer Zeichenfolge zu entfernen?

Beispielsweise:

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)"

Das obige sollte wirklich sein:

"Hulk Hogans Promi-Wrestling [Proj # 206010] (Reality-Serie)"

RJ.
quelle
Diese Frage wird aufgrund von Duplikaten geschlossen, die vorgeschlagene Antwort wird jedoch mit dem HTML Agility Pack gegeben. Wenn Sie HTML-Tags ohne Verwendung des HTML Agility Packs entfernen möchten, können Sie meine Antwort hier auf stackoverflow.com/a/30026043/2318354 verweisen . Was für
jemanden
6
Dies ist kein Duplikat, da "HTML Agility Pack - unerwünschte Tags entfernen, ohne Inhalte zu entfernen?" möchte einige Tags behalten (dh eine Liste gültiger Tags angeben, den Rest entfernen). Bei dieser Frage geht es darum, ALLE Tags zu entfernen. Und ich kann die Antworten der anderen Frage nicht verwenden, da ich keine Liste aller vorhandenen HTML-Tags weitergeben werde.
Thierry_S
Schauen Sie sich xidel an . Sie brauchen 95% des Weges dorthin xidel -s input -e '/'.
Josh Habdas

Antworten:

243

Sie können einen einfachen regulären Ausdruck wie diesen verwenden:

public static string StripHTML(string input)
{
   return Regex.Replace(input, "<.*?>", String.Empty);
}

Beachten Sie, dass diese Lösung einen eigenen Fehler aufweist. Weitere Informationen finden Sie unter Entfernen von HTML-Tags in String (insbesondere die Kommentare von @mehaase).

Eine andere Lösung wäre die Verwendung des HTML Agility Pack .
Ein Beispiel für die Verwendung der Bibliothek finden Sie hier: HTML Agility Pack - Entfernen unerwünschter Tags ohne Entfernen von Inhalten?

Bidou
quelle
2
Funktioniert nicht für die Eingabe: '7 <10 <b> aber </ b> 30> 10' ergibt: '7 aber 30> 10'
Bartosz Pierzchlewicz
Ja, weil es alles zwischen <und> entfernt, also in Ihrem Fall, < 10 <b>und </b>beide entfernt werden.
Bidou
2
Sollte der Methodenname nicht StripHtml () sein, da Methodennamen die Groß- und Kleinschreibung Pascal verwenden sollten?
David Klempfner
Die Verwendung regulärer Ausdrücke ist wahrscheinlich keine gute Idee, wenn Sie sie aus Sicherheitsgründen verwenden.
Mathias Lykkegaard Lorenzen
3
Ändern Sie einfach die Regex in <[a-zA-Z /] *?>
Brandon Prudent
54

Sie können die Zeichenfolge mit dem HTML Agility Pack analysieren und den InnerText abrufen.

    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(@"<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)");
    string result = htmlDoc.DocumentNode.InnerText;
ssilas777
quelle
Ich mag die InnerTextLösung, da sie alle Tags entfernt. Aber ... es hinterlässt &nbsp;und auch Kommentar - Tags wie <!-- xxx --> wie die umliegenden v:shapetype, v:shapeoder v:imagedatamit [if gte vml 1]oder[if !vml]
Thierry_S
7
Mir ist klar, dass dies &nbsp;eine HTML-Entität ist, kein Tag, also eine Lösung zum Entfernen result = WebUtility.HtmlDecode(result);und Entfernen der Kommentarknoten mithilfe des HTML-Agility-Pakets: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());kurz bevorresult = htmlDoc.DocumentNode.InnerText;
Thierry_S
3

Sie können den folgenden Code für Ihre Zeichenfolge verwenden und erhalten die vollständige Zeichenfolge ohne HTML-Teil.

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)".Replace("&nbsp;",string.Empty);            
        string s = Regex.Replace(title, "<.*?>", String.Empty);
Vinay
quelle