126 votes

Comment supprimer les balises HTML d'une chaîne de caractères en ASP.NET ?

En utilisant ASP.NET, comment puis-je supprimer les balises HTML d'une chaîne donnée de manière fiable (c'est-à-dire sans utiliser de regex) ? Je cherche quelque chose comme la fonction strip_tags .

Exemple :

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

Sortie :

"Bonjour"

J'essaie de ne pas réinventer la roue, mais je n'ai rien trouvé qui réponde à mes besoins jusqu'à présent.

0 votes

J'imagine que la fonction strip_tags de PHP utilise l'expression rationnelle en arrière-plan !

10 votes

@Daniel : parce que regex est très mauvais pour cela, surtout si vous avez des imbrications.

0 votes

Hmm, il ne semble pas que la fonction Strip_Tags de PHP soit particulièrement fiable, d'après les notes officielles et les commentaires : uk.php.net/strip_tags

113voto

Tomalak Points 150423

Si c'est juste un décapage todo balises HTML à partir d'une chaîne, cela fonctionne de manière fiable avec regex également. Remplacer :

<[^>]*(>|$)

avec la chaîne vide, globalement. N'oubliez pas de normaliser la chaîne après, en la remplaçant :

[\s\r\n]+

avec un seul espace, et en coupant le résultat. Optionnellement, remplacer toutes les entités de caractères HTML par les caractères réels.

Note :

  1. Il y a une limite : HTML et XML permettent > dans les valeurs des attributs. Cette solution sera renvoie un balisage défectueux lorsqu'il rencontre de telles valeurs.
  2. La solution est techniquement sûre, comme dans : Le résultat ne contiendra jamais rien qui puisse être utilisé pour faire du cross site scripting ou pour casser une mise en page. Mais elle n'est pas très propre.
  3. Comme avec toutes les choses HTML et regex :
    Utilice un analyseur correct si vous devez faire les choses correctement en toutes circonstances.

54 votes

Bien que cela ne soit pas demandé, je pense que de nombreux lecteurs voudront également supprimer l'encodage HTM, comme par exemple &quote; . Je le combine avec WebUtility.HtmlDecode pour cela (qui à son tour ne supprimera pas les balises). Utilisez-le après la suppression des balises, car il peut réécrire &gt; y &lt; . Par exemple WebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))

0 votes

@YahooSerious Merci d'avoir fourni un exemple. Cela fonctionne très bien. Merci.

0 votes

Html Agility Pack est la solution, je l'ai utilisé il y a longtemps dans les webforms pour dépouiller des pages web entières afin d'utiliser le contenu !

77voto

Serapth Points 4717

Allez télécharger HTMLAgilityPack, maintenant ! ;) Télécharger LInk

Cela vous permet de charger et d'analyser le HTML. Vous pouvez ensuite naviguer dans le DOM et extraire les valeurs internes de tous les attributs. Sérieusement, cela vous prendra environ 10 lignes de code au maximum. C'est l'une des meilleures bibliothèques .net gratuites qui existent.

En voici un exemple :

            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;
            }

2 votes

Vous pouvez même interroger chaque text() coupez le contenu et joignez ceux qui ont un espace. IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())

0 votes

Ou simplement utiliser doc.DocumentNode.InnerText, bien que cela pose quelques problèmes avec la gestion des espaces blancs, semble-t-il...

17 votes

Pourquoi le if (doc == null) chèque ? C'est toujours faux, n'est-ce pas ?

68voto

user95144 Points 1039
Regex.Replace(htmlText, "<.*?>", string.Empty);

5 votes

Il y a de nombreux problèmes - il ne traite pas les attributs contenant < ou > et il ne fonctionne pas bien avec les balises qui s'étendent sur plus d'une ligne, sauf s'il est exécuté avec RegexOptions.SingleLine .

2 votes

Noooo, utilisez "<[^>]*>".

11voto

meramez Points 61
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

2 votes

Cela ne fonctionne pas dans de nombreux cas, y compris pour les sauts de ligne non UNIX.

6voto

Michael Tipton Points 105

J'ai posté ce problème sur les forums asp.net, et il semble que ce soit toujours l'une des solutions les plus simples. Je ne garantis pas qu'elle soit la plus rapide ou la plus efficace, mais elle est assez fiable. Dans .NET, vous pouvez utiliser les objets HTML Web Control eux-mêmes. Tout ce que vous avez à faire, c'est d'insérer votre chaîne dans un objet HTML temporaire tel qu'un DIV, puis d'utiliser la fonction intégrée "InnerText" pour récupérer tout le texte qui n'est pas contenu dans les balises. Voir ci-dessous un exemple simple en C# :

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

0 votes

This doesn't seem to work, I tested it with simple InnerHtml="<b>foo</b>"; and InnerText has value "<b>foo</b>" :(

0 votes

Ne faites pas ça. Cette solution injecte du html non codé directement dans la sortie. Cela vous expose à des attaques de type "Cross Site Scripting" - vous venez de permettre à quiconque peut modifier la chaîne html d'injecter n'importe quel html et javascript arbitraire dans votre application !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X