Ceci est pour .NET. IgnoreCase est activé et MultiLine n'est PAS activé.
D'habitude, je suis bon en regex, peut-être que je manque de caféine...
Les utilisateurs sont autorisés à saisir des entités codées en HTML (<lt ;, <amp ;, etc.), et à utiliser les balises HTML suivantes :
u, i, b, h3, h4, br, a, img
Les <br/> et <img/> à fermeture automatique sont autorisés, avec ou sans l'espace supplémentaire, mais ne sont pas obligatoires.
Je le veux :
- Supprimez toutes les balises HTML initiales et finales autres que celles énumérées ci-dessus.
- Supprimez les attributs des balises restantes, sauf Les ancres peuvent avoir un href.
Mon modèle de recherche (remplacé par une chaîne vide) jusqu'à présent :
<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>
Ce site semble pour enlever tout sauf les balises de début et de fin que je veux, mais il y a trois problèmes :
- Devoir inclure la version de la balise finale de chaque balise autorisée est laid.
- Les attributs survivent. Cela peut-il se produire en un seul remplacement ?
- Tags en commençant par les noms de balises autorisés passent à travers. Par exemple, "<abbrev>" et "<iframe>".
Le modèle suggéré ci-dessous ne supprime pas les balises qui n'ont pas d'attributs.
</?(?!i|b|h3|h4|a|img)\b[^>]*>
Comme mentionné ci-dessous, ">" est légal dans une valeur d'attribut, mais on peut dire que je ne le supporterai pas. De plus, il n'y aura pas de blocs CDATA, etc. dont il faudra s'inquiéter. Juste un peu de HTML.
La réponse de Loophole est la meilleure jusqu'à présent, merci ! Voici son modèle (en espérant que le PRE fonctionne mieux pour moi) :
static string SanitizeHtml(string html)
{
string acceptable = "script|link|title";
string stringPattern = @"</?(?(?=" + acceptable + @")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>";
return Regex.Replace(html, stringPattern, "sausage");
}
Je pense que quelques petites améliorations pourraient encore être apportées à cette réponse :
-
Je pense qu'il est possible de modifier ce système pour capturer les commentaires HTML simples (ceux qui ne contiennent pas de balises) en ajoutant "!--" à la variable "acceptable" et en apportant une petite modification à la fin de l'expression pour permettre l'ajout d'un "" de fin facultatif. \s --".
-
Je pense que cela ne fonctionnerait pas s'il y a plusieurs caractères d'espacement entre les attributs (exemple : HTML fortement formaté avec des sauts de ligne et des tabulations entre les attributs).
Edit 2009-07-23 : Voici la solution finale que j'ai retenue (en VB.NET) :
Dim AcceptableTags As String = "i|b|u|sup|sub|ol|ul|li|br|h2|h3|h4|h5|span|div|p|a|img|blockquote"
Dim WhiteListPattern As String = "</?(?(?=" & AcceptableTags & _
")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>"
html = Regex.Replace(html, WhiteListPattern, "", RegExOptions.Compiled)
L'inconvénient est que l'attribut HREF des balises A est toujours supprimé, ce qui n'est pas idéal.
0 votes
Veuillez supprimer la balise [regular] inutile
0 votes
Avez-vous réussi à supprimer les attributs ? La réponse de Loophole ne semble pas le faire ?