Esto es para .NET. IgnoreCase está configurado y MultiLine NO está configurado.¿Cómo puedo filtrar todas las etiquetas HTML, excepto una determinada lista blanca?
Normalmente estoy decente en expresiones regulares, tal vez estoy quedando sin cafeína ...
Los usuarios se les permite entrar codificados en HTML entidades (< lt ;, < amp ;, etc.), y usar las siguientes etiquetas HTML:
u, i, b, h3, h4, br, a, img
de cierre automático < br/> y no se permiten < img/>, con o sin el espacio extra, pero no son necesarios.
Quiero:
- Gaza toda iniciar y finalizar las etiquetas HTML distintas de las enumeradas anteriormente.
- eliminar atributos de las etiquetas restantes, excepto anclas pueden tener un href.
Mi patrón de búsqueda (sustituido con una cadena vacía) hasta el momento:
<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>
Este parece ser pelar todos, pero las etiquetas de inicio y fin que quiero, pero hay tres problemas:
- tener que incluir la versión de etiqueta final de cada etiqueta permitido es feo.
- Los atributos sobreviven. ¿Puede suceder esto en un solo reemplazo?
- Etiquetas comenzando con los nombres de las etiquetas permiten deslizarse a través. Por ejemplo, "<abreviatura>" y "<iframe>".
El siguiente patrón sugerido no elimina las etiquetas que no tienen atributos.
</?(?!i|b|h3|h4|a|img)\b[^>]*>
Como se menciona más adelante, ">" es legal en un valor de atributo, pero es seguro decir que no voy a apoyar eso. Además, no habrá bloques CDATA, etc. de qué preocuparse. Solo un poco de HTML. respuesta
de escapatoria es el mejor hasta ahora, gracias! He aquí su patrón (esperando que el PRE funciona mejor para mí):
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");
}
Algunos pequeños retoques creo que todavía se podría hacer a esta respuesta:
Creo que esto podría ser modificado para capturar HTML simple comentarios (aquellos que no contienen etiquetas) agregando "! -" a la variable "aceptable" y haciendo un pequeño cambio al final de la expresión para permitir un "\ s--" posterior opcional.
Creo que esto se rompería si hay múltiples espacios en blanco entre los atributos de caracteres (por ejemplo: HTML con mucho formato con saltos de línea y pestañas entre los atributos).
Editar 2009-07-23: Aquí está la solución final fui con (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)
La advertencia es que el atributo HREF de un etiquetas todavía se restregó que no es ideal
por favor elimine innecesaria [regular] la etiqueta –
¿ha tenido alguna suerte para quitar los atributos? La respuesta de la laguna no parece hacer esto? – russau