2008-09-04 37 views
26

Estoy tratando de escribir una expresión regular para quitar todo el HTML con la excepción de los enlaces (las etiquetas <a href y </a> respectivamente. No tiene que ser 100% seguro (no me preocupa la inyección) ataques o cualquier cosa que a mí de análisis de contenido que ya ha sido aprobado y publicado en una película SWF).Quitar todas las etiquetas HTML, excepto los enlaces

Las "etiquetas" originales de la tira de expresiones regulares que estoy usando era <(.|\n)+?>, y traté de modificarlo para <([^a]|\n)+?>, pero eso por supuesto permitirá que cualquier etiqueta que tenga a en ella en lugar de una que lo tenga al principio, 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.

Respuesta

26
<(?!\/?a(?=>|\s.*>))\/?.*?> 

Pruebe 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. Poner esto en un subst con

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g; 

Esto debe dejar sólo la apertura y el cierre de un tag

+0

Esto no funciona para mí con 'sed' ... – Geremia

1

sigo pasando sobre él, pero no hay manera que puedo recomendar regexr con demasiada frecuencia. Es fantástico para probar este tipo de cosas.

1

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 que se deben eliminar todas las etiquetas sustituyendo/</y/>/con la cadena vacía o sus equivalentes entidad, pero filtrando selectivamente HTML usando expresiones regulares será vulnerable a una amplia gama de entradas accidentales o maliciosos romper cosas.

0

Aquí van:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>} 
-2

strip_tags() hace esto.

Aquí, estoy incluyendo todos <a><p><font><b><i><sup> etiquetas y dar salida a una versión arreglada:

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 
Cuestiones relacionadas