Comunidad de diseño web y desarrollo en internet online

RegExp: encontrar sílabas repetidas... no funciona

Citar            
MensajeEscrito el 26 May 2011 07:16 pm
Bueno, me doy.

Mi intención es dada una cadena de caracteres, encontrar si esa cadena tiene sílabas repetidas seguidas. Por ejemplo esta cadena:

Código :

esto es una prueba

No tiene sílabas repetidas seguidas, esta sí:

Código :

es es un prueba

Porque "es"+espacio es igual a "es"+espacio.

Para lograrlo construí una expresión regular tal como esta:

Código :

(.+)\1+

Que funciona de maravilla en The Regex Coach.
Pero, al pasala a PHP:

Código PHP :

$expresion = "/(.+)\1+/is";
$cad = "es es una prueba";
$c = preg_match_all($expresion, $cad, $aux);
echo $;
print_r($aux);

No hace nada. Nunca encuentra nada sin importar qué haya en $cad. ¿Por qué?

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 26 May 2011 09:09 pm
vaya interesante ahora lo veo,
y una cosa te comiste una "c"
en la linea 4

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 27 May 2011 12:31 pm
tuadmin:
Error de copy & paste, sorry. Lo había notado luego de postear pero no influye nada en el problema.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 28 May 2011 04:33 pm
bueno al parecer php no es 100% fino en las expresiones regulares,
The Regex Coach. segun viendo las features y especialmente esta linea

Código :

The Regex Coach is a graphical application for Windows which can be used to experiment with (Perl-compatible) regular expressions interactively. It has the following features: 


The Regex Coach es una aplicación gráfica para Windows que puede utilizar para experimentar con (compatibilidad con Perl) las expresiones regulares de forma interactiva. Tiene las siguientes características:

segun eso es mas compatible con Perl y pues segun la info de PHP las diferencias con expresiones regulares tienen cierta diferencia entre ambos lenguajes aunque tenga un comun denominador que es pcre.

jeje muy interesante pero me rompi la cabeza 2 dias viendo por que no daba ese ejemplo, pero beuno me entretuve buscando informacion.

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 May 2011 06:46 pm
tuadmin:
Te agradezco mucho el esfuerzo.

Por lo que comentas, bien, es cierto. Pero sucede que PHP también usa el mismo motor de expresiones regulares que Perl (PCRE, "Perl Compatible Regular Expresion") y con cualquier otra cosa, las mismas RegExp de Perl funcionan con PHP.

El "problema" está cuando se usan retrorreferencias ("\1").

Descubrí que hay que poner DOS barras invertidas para que asuma que el número indica una retrorreferencia (back reference) y esto no está en la documentación de PHP.

Entonces mi código quedaría así:

Código PHP :

   $expresion = "/(.+)\\1+/is";
   $cad = "esto esto una cad ena cad ena";
   $c = preg_match_all($expresion, $cad, $aux);
   echo $c;
   echo "<pre>";
   print_r($aux);
   echo "</pre>";

Devuelve:

Código :

2
Array
(
    [0] => Array
        (
            [0] => esto esto 
            [1] => na cad ena cad e
        )

    [1] => Array
        (
            [0] => esto 
            [1] => na cad e
        )

)

Que es exactamente lo que estaba buscando :).

Dejo esto aquí para provecho del resto de los colegas. Saludos.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 28 May 2011 08:56 pm
plop!
:)
ahora me hiciste recuerdo lo del slash invertido debe ser siempre escapado.

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.