Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/04/2011, 13:26
angelfcm
(Desactivado)
 
Fecha de Ingreso: abril-2011
Mensajes: 153
Antigüedad: 8 años, 9 meses
Puntos: 236
Expresión regular en PHP

Hola!
Tengo un acertijo que no he podido resolver!

Si por ejemplo:
1 - En la variable $msj se almacenan los datos que el usuario escribió junto con etiquetas.
2 - No puede haber ningúna etiqueta distinta a estas: <queso>, <puré>, <pizza>.

¿Como puedo usar la expresión regular para que elimine toda etiqueta que no sea ningúna a las mencionadas?

Básicamente no debe haber ningún contenido dentro de <> que sea distinto a lo anterior.

He intentado algo como esto:
$filtro='/<(([^q][^u][^e][^s][^o])|([^p][^u][^r][^é])|([^p][^i][^z][^z][^a]))>/i';
$msj=preg_replace($filtro,'',$msj);

Si funcioná pero cuando hay una palabra con más carácteres que las excepciones no lo borra.
Ejemplo
La etiqueta <queso con papas> tiene más carácteres que <queso>, <puré>o <pizza> entonces no se elimina. No entiendo muy bien el por que, pero lo que hize fué agregar al filtro antes de >/i';
es lo siguiente:
([^>]+)?
que significa que tal véz hay más de un carácter después del filtro anterior y distinto a ">" ya que es el carácter final de la etiqueta y debe saber dónde terminar.
Pero no funciona bien por que elimina otras cosas que no debería y no se muy bien porque.
El propósito de saber hacer esto es que hize un editor de texto con HTML en tiempo real(por así decirlo), que cuándo se envié se filtre todo el HTML que no sea admitido por que no quiero que metan estilos que no se permiten o funciones javascript.
Por ejemplo:
No quiero <input type="submit" value="Aceptar" /> o un <div style="position:absolute">Soy libre!!!</div>, etc, etc. Ya que todo esto se puede meter desde la barra de dirección web.

Por último cabe mencionar que el filtro como lo escribi arriba si suele funcionar aparentemente bien pero las etiquetas de cierre también las elimina ejemplo:
<queso>Hola me llamo Pancho Villa y juego Gears 3 Beta</queso><etiqueta no admitida>
después del filtro queda así:
<queso>Hola me llamo Pancho Villa y juego Gears 3 Beta
y yo quiero esto
<queso>Hola me llamo Pancho Villa y juego Gears 3 Beta</queso>

Espero y me haya entendido un 70% y que puedan encontrar una solución jeje Saludos y Gracias por responder!!

=D