Foros del Web » Programando para Internet » PHP »

Expresiones regulares y patrones recursivos, duda

Estas en el tema de Expresiones regulares y patrones recursivos, duda en el foro de PHP en Foros del Web. Hola a todos, es mi primer post en este foro, y espero no meter la pata Antes que nada, gracias por tomarse el tiempo de ...
  #1 (permalink)  
Antiguo 23/05/2007, 09:01
 
Fecha de Ingreso: mayo-2007
Mensajes: 9
Antigüedad: 16 años, 11 meses
Puntos: 0
Expresiones regulares y patrones recursivos, duda

Hola a todos, es mi primer post en este foro, y espero no meter la pata

Antes que nada, gracias por tomarse el tiempo de leer esto y sobre todo de contestarlo. Según yo busque antes, para no duplicar el post, pero si aun así estaba, me disculpo

Mi duda es, ¿alguien sabe usar patrones recursivos (Compatibles con Perl)?

Tengo un problema específico, obtener texto de un archivo de LaTeX, el cual esta claramente delimitado por un "comando" del estilo \comando{[valores]} y la información que yo quiero es "valores".
Hasta ahí, parece fácil, pero las cosas se complican, cuando \comando, esta dentro de \otro_comando, y dentro de \comando hay varios \mini_comandos. ¿no esta claro? pongo un ejemplo

Código:
\otro_comando{ bla bla [...]
\comando{valores \mini_comando{[...]} 
valores }
\MAS_comandos{[..]}
}
Lo que ami me interesa, es el texto en rojo y pensé que tenía resuelto el problema con ¡¡Expresiones regulares y patrones recursivos!! Pero... no entiendo como funciona ¿alguien sabe usarlas?

El ejemplo del manual de PHP (mx.php.net/manual/es/reference.pcre.pattern.syntax.php) es el siguiente:
Para obtener el contenido de de una cadena con paréntesis anidadados se usa el siguiente patron /\( ( ( (?>[^()]+) | (?R) )* ) \)/x, entonces si la cadena tiene "000\ba(dc(fe)(hg(ji)lk)nm)oñ(0000)\ab(cd(ef)(gh(i j)kl)mn)ño(0000)" va encontrar "dc(fe)(hg(ji)lk)nm", y efectivamente lo hace,
Código PHP:
preg_match("/\( ( ( (?>[^()]+) | (?R) )* ) \)/uisx",
"000\\ba(dc(fe)(hg(ji)lk)nm)oñ(0000)\\ab(cd(ef)(gh(ij)kl)mn)ño(0000)",
$keys);
echo 
$keys[1]; // imprime "dc(fe)(hg(ji)lk)nm" 
Hora, lo que a mi me gustaria poder encontrar es "cd(ef)(gh(ij)kl)mn", es decir, buscar "\ab(cd(ef)(gh(ij)kl)mn)" y que me de su contenido, o mejor aun.

Si tenemos la cadena "000\ba{dc{fe}{hg{ji}lk}nm}oñ{0000}\ab{cd{ef}{gh{i j}kl}mn}ño{0000}"
yo quiero encontrar el contenido de \ab{[contenido]}.

Si alguien tiene una pista, estaré eternamente agradecida, pues estoy que me jalo los pelos.

Por ultimo, y tal vez me quieran matar, pero el problema ya esta resuelto con una función algo complicada, que busca el comando y pone indices a las llaves "{}", pero me gustara tener la solución con expresiones regulares

Mil gracias

Última edición por pato@feliz; 29/05/2007 a las 14:57
  #2 (permalink)  
Antiguo 29/05/2007, 15:12
 
Fecha de Ingreso: mayo-2007
Mensajes: 9
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Expresiones regulares y patrones recursivos, duda

Yo misma logre la respuesta!! Pero como soy floja para explicarla solo pondré la solución.

Para encontrar cd{ef}{gh{ij}kl}mn
dento de 000\ba{dc{fe}{hg{ji}lk}nm}oñ{0000}\ab{cd{ef}{gh{ij}kl}mn}ño{0000} usen el siguiente codigo:

Código PHP:
// cadena original = 
// 000\ba{dc{fe}{hg{ji}lk}nm}oñ{0000}\ab{cd{ef}{gh{ij}kl}mn}ño{0000}
// pongo doble diagonal, porque sino php se confunde
$cadena "000\\ba{dc{fe}{hg{ji}lk}nm}oñ{0000}\\ab{cd{ef}{gh{ij}kl}mn}ño{0000}";
$exp_reg "/\{ ( ( (?>[^{}]+) | (?R) )* ) \}/uisx";

preg_match($exp_reg$cadena$salidaPREG_OFFSET_CAPTURE,
stripos($cadena,"\\ab") );

echo 
$salida[1][0]; 
Espero le sirva a alguien, Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:34.