Pregunta

Estoy intentando escribir una expresión regular para eliminar todo el HTML con excepción de los enlaces (el <a href y </a> etiquetas respectivamente.No tiene que ser 100% seguro (no me preocupan los ataques de inyección ni nada por el estilo, ya que estoy analizando contenido que ya ha sido aprobado y publicado en un fondos soberanos película).

La expresión regular original de "etiquetas de tira" que estoy usando era <(.|\n)+?>, y traté de modificarlo para <([^a]|\n)+?>, pero eso, por supuesto, permitirá que cualquier etiqueta que tenga un a en él en lugar de uno que lo tiene al principio, con un espacio.

No es que realmente deba importar, pero en caso de que a alguien le interese saber, estoy escribiendo esto en ActionScript 3.0 para Destello película.

¿Fue útil?

Solución

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

Prueba esto.Tenía algo similar para las etiquetas p.Funcionó para ellos, así que no veo por qué no.Utiliza una anticipación negativa para comprobar que no coincide con un (con el prefijo / opcional) donde (usando una anticipación positiva) a (con un prefijo / opcional) va seguido de un > o un espacio, cosas y luego >.Esto luego coincide hasta el siguiente > carácter.Pon esto en un sustituto con

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

Esto debería dejar solo las etiquetas de apertura y cierre.

Otros consejos

Sigo hablando de ello, pero no hay forma de recomendarlo. expresión regular con demasiada frecuencia.Es fantástico para probar este tipo de cosas.

En general, hay problemas con este enfoque.Las expresiones regulares son mejores para coincidencias de texto "plano": los datos anidados empujan a los motores de expresiones regulares a áreas para las que no están diseñados.El análisis general de HTML necesita un analizador, no un motor de expresiones regulares (busque en Google la diferencia entre lenguajes normales y libres de contexto si desea conocer 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 filtrar HTML selectivamente usando expresiones regulares será vulnerable a una amplia gama de entradas accidentales o maliciosas que rompan cosas.

Aquí tienes:

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

Qué tal si

<[^a](.|\n)+?>

?

strip_tags() Haz esto.

Aquí incluyo a todos. <a><p><font><b><i><sup> etiquetas y generando 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top