php regex para que coincida con las tags html

Estoy haciendo un preg_replace en la página html. Mi patrón está destinado a agregar tags circundantes a algunas palabras en html. Sin embargo, a veces mi expresión regular modifica las tags html. Por ejemplo, cuando bash reemplazar este texto:

yasar 

Para que yasar lea yasar , mi expresión regular también reemplaza a yasar en el atributo alt de la etiqueta de anclaje. Actual preg_replace() Estoy usando se ve así:

 preg_replace("/(asf|gfd|oyws)/", '${1}',$target); 

¿Cómo puedo hacer una expresión regular para que no coincida con nada dentro de una etiqueta html?

Puede usar una aserción para eso, ya que solo tiene que asegurarse de que las palabras buscadas ocurran alguna vez después de un > , o antes de cualquier < . La última prueba es más fácil de realizar ya que las aserciones futuras pueden ser de longitud variable:

 /(asf|foo|barr)(?=[^>]*(< |$))/ 

Consulte también http://www.regular-expressions.info/lookaround.html para obtener una buena explicación de esa syntax de aserción.

Yasar, resucitando esta pregunta porque tenía otra solución que no fue mencionada.

En lugar de simplemente verificar que el siguiente carácter de etiqueta sea una etiqueta de apertura, esta solución omite todas las .

Con todos los descargos de responsabilidad sobre el uso de expresiones regulares para analizar html, aquí está la expresión regular:

 < [^>]*>(*SKIP)(*F)|word1|word2|word3 

Aquí hay una demostración . En el código, se ve así:

 $target = "word1 word2 again word3"; $regex = "~< [^>]*>(*SKIP)(*F)|word1|word2|word3~"; $repl= '\0'; $new=preg_replace($regex,$repl,$target); echo htmlentities($new); 

Aquí hay una demostración en línea de este código.

Referencia

  1. Cómo hacer coincidir el patrón, excepto en las situaciones s1, s2, s3
  2. Cómo hacer coincidir un patrón a menos que …

Este podría ser el tipo de cosa que buscas: http://snipplr.com/view/3618/ En general, desaconsejaría tal cosa. Una mejor alternativa es eliminar todas las tags HTML y, en su lugar, confiar en BBcode, como por ejemplo:

 [b]bold text[b] [i]italic text[i] 

Sin embargo, aprecio que esto no funcione bien con lo que estás tratando de hacer.

Otra opción puede ser HTML Purifier, ver: http://htmlpurifier.org/

Desde mi punto de vista, esto debería estar funcionando:

 echo preg_replace("/< (.*)>(.*)< \/(.*)>/i","< $1>$2",$target); 

Pero, no sé qué tan seguro sería esto. Solo estoy presentando una posibilidad 🙂