paginas - html ejemplos para editar
Pelar todas las etiquetas HTML excepto enlaces (6)
Aqui tienes:
{<(?!i|b|h[1-6]|/i|/b|/h[1-6][/s|>|/])[^>]*>}
Intento escribir una expresión regular para eliminar todo el HTML a excepción de los enlaces (las etiquetas <a href
y </a>
respectivamente. No tiene que ser 100% seguro (no me preocupan los ataques de inyección ni nada por el estilo). Estoy analizando contenido que ya ha sido aprobado y publicado en una película SWF ).
La expresión regular original "strip tags" que estoy usando era <(.|/n)+?>
, Y traté de modificarla a <([^a]|/n)+?>
, Pero eso por supuesto permitir cualquier etiqueta que tenga una a en lugar de una que tenga al comienzo, con un espacio.
No es que realmente importe, pero en caso de que a alguien le interese saber, estoy escribiendo esto en ActionScript 3.0 para una película Flash .
En general, hay problemas con este enfoque. Las expresiones regulares son mejores para las coincidencias de texto ''planas'': los datos anidados empujan a los motores de expresiones regulares hacia áreas para las cuales no están diseñados. El análisis HTML general necesita un analizador no un motor de expresiones regulares (Google busca la diferencia entre los lenguajes normales y los que no requieren contexto si desea obtener todos los detalles técnicos).
Es fácil eliminar todas las etiquetas reemplazando / </ y /> / con la cadena vacía o sus equivalentes de entidad, pero el filtrado selectivo de HTML utilizando expresiones regulares será vulnerable a una amplia gama de entradas accidentales o maliciosas que interrumpen las cosas.
Qué tal si
<[^a](.|/n)+?>
?
Sigo hablando al respecto, pero no hay forma de que pueda recomendar regexr demasiada frecuencia. Es fantástico para probar este tipo de cosas.
strip_tags()
hace esto.
Aquí, <a><p><font><b><i><sup>
todas las etiquetas <a><p><font><b><i><sup>
y obtengo una versión ordenada:
cat input.htm | tr -d ''/n'' | php -r ''$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");'' | tidy -i -wrap 0 -o output.htm
<(?!//?a(?=>|/s.*>))//?.*?>
Prueba esto. Tenía algo similar para las etiquetas p. Trabajó para ellos, así que no veo por qué no. Utiliza la búsqueda negativa para comprobar que no concuerda con a (con el prefijo / carácter opcional) donde (usando el look-up positivo) a (con opcional / prefijo) va seguido de un> o un espacio, y luego>. Esto luego coincide hasta el próximo> caracter. Pon esto en un subst con
s/<(?!//?a(?=>|/s.*>))//?.*?>//g;
Esto debería dejar solo la apertura y el cierre de las etiquetas