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 recherche quelque chose comme PHP strip_tags
.
Exemple:
<ul><li>Hello</li></ul>
Production:
"Bonjour"
J'essaie de ne pas réinventer la roue, mais je n'ai rien trouvé qui réponde à mes besoins jusqu'à présent.
Réponses:
S'il s'agit simplement de supprimer toutes les balises HTML d'une chaîne, cela fonctionne également de
manière fiableavec regex. Remplacer:avec la chaîne vide, globalement. N'oubliez pas de normaliser la chaîne par la suite, en remplaçant:
avec un seul espace et découper le résultat. Remplacez éventuellement les entités de caractères HTML par les caractères réels.
Remarque :
>
valeurs d'attribut. Cette solution sera de retour balisage cassé lors de la rencontre de telles valeurs.utilisez un analyseur approprié si vous devez faire les choses correctement en toutes circonstances.
la source
"e;
. Je le combine avecWebUtility.HtmlDecode
pour cela (qui à son tour ne supprimera pas les balises). Utilisez-le après la suppression des balises, car il peut réécrire>
et<
. Par exempleWebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
Allez télécharger HTMLAgilityPack, maintenant! ;) Télécharger LInk
Cela vous permet de charger et d'analyser le HTML. Ensuite, vous pouvez 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 plus grandes bibliothèques .net gratuites.
Voici un exemple:
la source
text()
nœud, découper le contenu et la chaîne.IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
if (doc == null)
chèque? C'est toujours faux, non?la source
RegexOptions.SingleLine
.la source
J'ai posté ceci sur les forums asp.net, et cela semble toujours être l'une des solutions les plus simples. Je ne garantis pas que ce soit le plus rapide ou le plus efficace, mais c'est assez fiable. Dans .NET, vous pouvez utiliser les objets HTML Web Control eux-mêmes. Tout ce que vous avez vraiment à faire est d'insérer votre chaîne dans un objet HTML temporaire tel qu'un DIV, puis d'utiliser le "InnerText" intégré pour saisir tout le texte qui n'est pas contenu dans les balises. Voir ci-dessous pour un exemple C # simple:
la source
J'ai écrit une méthode assez rapide en c # qui bat l'enfer hors du Regex. Il est hébergé dans un article sur CodeProject.
Ses avantages sont, parmi de meilleures performances, la possibilité de remplacer les entités HTML nommées et numérotées (comme
&amp;
et&203;
) et le remplacement des blocs de commentaires et plus encore.Veuillez lire l' article connexe sur CodeProject .
Je vous remercie.
la source
Pour ceux d'entre vous qui ne peuvent pas utiliser HtmlAgilityPack, le lecteur XML .NETs est une option. Cela peut échouer sur du HTML bien formaté, alors ajoutez toujours une capture avec regx comme sauvegarde. Notez que ce n'est PAS rapide, mais cela offre une belle opportunité pour le débogage à l'ancienne.
la source
la source
Pour ceux qui se plaignent du fait que la solution de Michael Tiptop ne fonctionne pas, voici la façon .Net4 + de le faire:
la source
la source
J'ai regardé les solutions basées sur Regex suggérées ici, et elles ne me remplissent pas de confiance sauf dans les cas les plus triviaux. Un crochet angulaire dans un attribut est tout ce qu'il faudrait pour casser, sans parler du HTML mal formé à partir de la nature. Et qu'en est-il des entités comme
&
? Si vous souhaitez convertir du HTML en texte brut, vous devez également décoder les entités.Je propose donc la méthode ci-dessous.
En utilisant HtmlAgilityPack , cette méthode d'extension supprime efficacement toutes les balises HTML d'un fragment html. Décode également les entités HTML comme
&
. Renvoie uniquement les éléments de texte internes, avec une nouvelle ligne entre chaque élément de texte.Si vous êtes vraiment sérieux, vous voulez ignorer le contenu de certaines balises HTML trop (
<script>
,<style>
,<svg>
,<head>
,<object>
viennent à l' esprit!) Parce qu'ils ne contiennent probablement un contenu lisible dans le sens que nous sommes après. Ce que vous faites là-bas dépendra de votre situation et de la distance que vous souhaitez parcourir, mais en utilisant HtmlAgilityPack, il serait assez simple de mettre sur liste blanche ou sur liste noire les balises sélectionnées.Si vous restaurez le contenu sur une page HTML, assurez-vous de comprendre la vulnérabilité XSS et comment l'empêcher - c'est-à-dire toujours encoder tout texte saisi par l'utilisateur qui est rendu sur une page HTML (
>
devient>
etc.).la source
Pour le deuxième paramètre, c'est-à-dire conserver certaines balises, vous aurez peut-être besoin d'un code comme celui-ci en utilisant HTMLagilityPack:
Plus d'explications sur cette page: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/
la source
Vous pouvez également le faire avec AngleSharp qui est une alternative à HtmlAgilityPack (pas que HAP soit mauvais). Il est plus facile d'utiliser que HAP pour extraire le texte d'une source HTML.
Vous pouvez jeter un oeil à la section des fonctionnalités clés où ils plaident pour être «meilleur» que HAP. Je pense que pour la plupart, c'est probablement exagéré pour la question actuelle, mais c'est quand même une alternative intéressante.
la source
Utilisez simplement
string.StripHTML();
la source