Comment supprimer toutes les balises HTML d'une chaîne sans savoir quelles balises s'y trouvent?

122

Existe-t-il un moyen simple de supprimer toutes les balises HTML ou TOUT HTML lié d'une chaîne?

Par exemple:

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;)"

Ce qui précède devrait vraiment être:

«Lutte de championnat de célébrité de Hulk Hogan [Proj # 206010] (série de réalité)»

RJ.
la source
Cette question est fermée en raison de la duplication, mais la réponse suggérée est donnée en utilisant Html Agility Pack. Si vous souhaitez supprimer les balises html sans utiliser le pack Html Agility, vous pouvez consulter ma réponse ici stackoverflow.com/a/30026043/2318354 . Ce qui peut être utile à quelqu'un
Dilip0165
6
Ce n'est pas un doublon, comme "Pack d'agilité HTML - supprimer les balises indésirables sans supprimer le contenu?" souhaite conserver certaines balises (par exemple, donner une liste de balises valides, supprimer le reste). Cette question concerne la suppression de TOUTES les balises. Et je ne peux pas utiliser les réponses de l'autre question car je ne vais pas passer dans une liste de toutes les balises html existantes.
Thierry_S
Jetez un œil à xidel . Cela vous prendra 95% du chemin avec xidel -s input -e '/'.
Josh Habdas le

Réponses:

247

Vous pouvez utiliser une simple expression régulière comme celle-ci:

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

Sachez que cette solution a son propre défaut. Voir Supprimer les balises HTML dans String pour plus d'informations (en particulier les commentaires de @mehaase)

Une autre solution serait d'utiliser le HTML Agility Pack .
Vous pouvez trouver un exemple utilisant la bibliothèque ici: Pack d'agilité HTML - supprimer les balises indésirables sans supprimer le contenu?

Bidou
la source
2
Ne fonctionne pas pour l'entrée: '7 <10 <b> mais </b> 30> 10' cela donne: '7 mais 30> 10'
Bartosz Pierzchlewicz
Oui, car il supprime tout entre <et>, donc dans votre cas, < 10 <b>et </b>sont tous les deux dépouillés.
Bidou
2
Le nom de la méthode ne devrait-il pas être StripHtml () puisque les noms de méthode doivent utiliser la casse Pascal?
David Klempfner
Utiliser des expressions régulières pour cela n'est probablement pas une bonne idée si vous l'utilisez pour des raisons de sécurité.
Mathias Lykkegaard Lorenzen
3
Changez simplement l'expression régulière en <[a-zA-Z /] *?>
Brandon Prudent
54

Vous pouvez analyser la chaîne à l'aide du pack Html Agility et obtenir l'InnerText.

    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
la source
J'aime la InnerTextsolution car elle supprime toutes les balises. Mais ... il laisse derrière lui &nbsp;et commente aussi des tags tels que <!-- xxx --> ceux qui l'entourent v:shapetype, v:shapeou v:imagedataavec [if gte vml 1]ou[if !vml]
Thierry_S
7
Je me rends compte que &nbsp;c'est une entité html, pas une balise, donc une solution pour supprimer cela pourrait être result = WebUtility.HtmlDecode(result);et pour supprimer les nœuds de commentaires, en utilisant le Html Agility Pack: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());juste avant de faireresult = htmlDoc.DocumentNode.InnerText;
Thierry_S
3

Vous pouvez utiliser le code ci-dessous sur votre chaîne et vous obtiendrez la chaîne complète sans partie html.

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
la source