Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/05/2007, 09:01
pato@feliz
 
Fecha de Ingreso: mayo-2007
Mensajes: 9
Antigüedad: 17 años
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