Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: yovaninu en 19 Agosto 2012, 07:01 am



Título: Ayuda con expresion Regular [Solucionado]
Publicado por: yovaninu en 19 Agosto 2012, 07:01 am
Usando un patron como expresion regular he logrado capturar una parte de mi cadena, el problema surge cuando el inicio y final del patron coincide con todo o parte de la cadena lo cual es incorrecto para mis propositos. Este es el codigo:

Código:

$cadena1 = "mi opiniooooon es que lo que no come lo bota";

$patron="/opini[\w\W]+n/";

echo "Resultado:".preg_replace($patron,"OPINION",$cadena1);


Como se observa el patron me debe permitir capturar la palabra 'opiniooooon' y  reemplazarlo por 'OPINION' (en mayusculas), lo cual es correcto.
El resultado es: mi OPINION es que lo que no come lo bota --- (OK)

Si la cadena cambia a "mi opiniooooon es que lo que no comen lo bota" (observese la letra 'n' de la palabra 'comen'), el resultado es: mi OPINION lo bota --- (Incorrecto),

De lo que deduzco que el patron hace que busque desde 'opini' hasta 'n' pero la 'n' de la palabra 'comen' y todo eso se reemplaza por OPINION y sigue el resto de la cadena.

Pregunta: ¿Como hacer para que el patron reconozca solo aquella palabra donde haga un match o una coincidencia?

Espero haberme explicado y desde ya gracias.


Título: Re: Ayuda con expresion Regular
Publicado por: ~ Yoya ~ en 19 Agosto 2012, 16:04 pm
Tienes dos problemas.
  • El primero es que estas utilizando una Meta-Secuencias que no deberias utilizar en este caso. Que es \W
  • El segundo problema es que debes hacer que la expresión finalice al encontrar la primera coincidencia y no la ultima coincidencia

La razón porque en este caso no debes utilizar la Meta-Secuencia \W, es porque estas combinando \w y \W en un campo de carácter ([\w\W]), con eso vas a tomar cualquier caracteres, ya sea alfa-numérico, signos, caracteres raro, TODO. En este solo necesitas utilizar \w, ya que solo estas capturando una cadena de caracteres del abecedario.

El otro problema es que debes hacer que finalice al encontrar la primera coincidencia y no a la ultima coincidencia. Para esto utilizas el cuantificador ? en combinación al cuantificador + o *.

Código
  1. preg_replace('/opini[\w]+n/i', 'OPINION', 'mi opiniooooon es que lo que no comen lo bota');
Salida:
Código:
mi OPINION es que lo que no comen lo bota


Y utilizando ?, para que termine en la primera coincidencia.
Código
  1. preg_replace('/opini[\w\W]+?n/i', 'OPINION', 'mi opiniooooon es que lo que no comen lo bota');
Salida:
Código:
mi OPINION es que lo que no comen lo bota


Esto seria lo correcto para tu caso:
Código
  1. preg_replace('/opini[\w]+?n/i', 'OPINION', 'mi opiniooooon es que lo que no comen lo bota');
Salida:
Código:
mi OPINION es que lo que no comen lo bota


Te recomiendo esta web para que pruebes tus regex, yo siempre la utilizo: Regex Tool (http://regex.larsolavtorvik.com/).

Saludos.


Título: Re: Ayuda con expresion Regular
Publicado por: yovaninu en 19 Agosto 2012, 16:38 pm
Correcto. Muy agradecido por tan clara solucion y por tan buena explicacion.