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.
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
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.).