Comunidad de diseño web y desarrollo en internet online

Ayuda con expresiones regulares

Citar            
MensajeEscrito el 13 Oct 2011 06:52 pm
Buenas con todos, pasaba por aquí para ver si alguien pudiese darme una mano con este tema. Miren tengo una cadena de este tipo

Código PHP :

$var = "texto bla  a:3:{otro texto a:2:{texto texto} mas texto a:5:{y un texto mas} texto final} texto";


entonces lo que quiero es que la expresión regular sea capaz de capturar estos patrones entre llaves dentro del bloque de llaves principales, pensé en esto al principio (pongo espacios para que sea mas legible aunque suene irónico :P

Código PHP :

$patron = '/(.*)(a:[0-9]+:\{ [ ^\{ ]* (a:[0-9]+:{ [ ^\} ]* \}){0,} [ ^\} ]* \} )(.*)/'


que va así: encuentra el sub-patrón a:cualquier numero de mas de un dígito : cualquier carácter menos la cerradura de llaves hasta la siguiente cerradura de llaves, repitiéndose desde 0 a mas veces.

usando:

preg_match_all($pat, $var, $arrvar, PREG_PATTERN_ORDER);

pero no obtengo lo que quiero.

Trate de aplicar sub-patrones condicionales modificar la codicia en el patrón de repetición, pero no llego a obtenerlo, o de repente estoy enfocando mal el problema.

De antemano gracias
Un saludo

Por Mr. X-ecutor

96 de clabLevel

1 tutorial

Genero:Masculino  

12/02/2007

firefox
Citar            
MensajeEscrito el 13 Oct 2011 07:53 pm
A ver... A la expresión que has usando le sobran cosas. He llegado a esta:

Código :

\ba:\d+:\{(.+)\}\s

"Separador de palabra seguido de la letra 'a', seguida del del caracter ':', seguido de uno o más caracteres numéricos, seguido del caracter ':', seguido de la llave '{', selección de cualquier cosa con voracidad hasta la última llave '}' que está seguida de un espacio en blanco".
Esto funciona bien para capturar este texto:

Código :

a:3:{otro texto a:2:{texto texto} mas texto a:5:{y un texto mas} texto final} 

Y extraer lo que está entre las llaves externas.
El problema es que para capturar recursivamente las llaves internas hay que hacer la selección central en no voraz. Eso se logra agregando "?" después de "+" en la selección central:

Código :

\ba:\d+:\{(.+?)\}\s

Pero la expresión deja de evaluar en la primera llave '}' por lo que no captura todo lo que debería...
Por el momento no encuentro solución.

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

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