Comunidad de diseño web y desarrollo en internet online

Pequeño problema con una expresión regular

Citar            
MensajeEscrito el 06 Mar 2009 08:56 pm
Saludos...

Para ser breve, tengo una expresion regular como esta: '/([0-9])/' y una cadena como esta 12345, lo que daria en php un codigo asi:

Código PHP :

<?php preg_match_all('/([0-9])/', '12345', $matches); ?>


El punto es que necesitaria en este caso que preg_match_all me devuelva en matches un array con todos los numeros por separado es decir algo asi:

Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)

[1] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)

)

Pero que el patrón SÓLO funcione si coincide de principio a fin de la cadena, es decir, que algo asi: 123a45, no me devuelva nada...

Si utilizo algun tipo de comodin, por ej: /([0-9])+/ hace esto ultimo pero entonces ya no me divide los resultados y, por el contrario, me trae solo el ultimo resultado, es decir:

Array
(
[0] => Array
(
[0] => 12345
)

[1] => Array
(
[0] => 5
)

)

Me gustaría una manera de solucionar esto sin aplicar 2 preg_match ni ningun otro truco, se puede?

Espero que alguien pueda darme una mano. Thank you :)

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 06 Mar 2009 09:22 pm
Ehm, si funciona bien. No sé porque dices que no te funciona. Esto arroja exactamente lo que quieres. Recuerda que el resultaod se guarda en $matches, preg_match_all, regresa 5 por ser el último.

Código :

echo "<pre>";
preg_match_all('/(\d)/', '12345', $matches);
print_r($matches); 
echo "</pre>";


No veo ningun problema, hasta ahora. :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 06 Mar 2009 10:03 pm
A ver, no me supe explicar:

a. yo necesito TODAS las coincidencias, tal como tu ejemplo me las devuelve
b. PERO solamente si el patron coincide de principio a final.

Ejemplo regex 1: '/(\d)/':

me trae todas las coincidencias en un array separado, esto está muy bien

pero si le coloco '123a45' me omite la a y en cambio no deberia devolverme nada...

***

Ejemplo regex 2: '/(\d)+/'

Si le coloco 123a45 no me devuelve nada y eso está bien

Pero si le envio 12345 no me devuelve los numeros separados:

resultado escribió:
Array
(
[0] => Array
(
[0] => 12345
)

[1] => Array
(
[0] => 5
)

)

Básicamente me pregunto si hay un modificador, flag, otra función o algo que si me devuelva todas las coincidencias no importa si estan con un comodin * o +

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 06 Mar 2009 11:05 pm

http://ve.php.net/manual/es/reference.pcre.pattern.syntax.php escribió:

Cuando un sub-patrón de captura es repetido, el valor capturado es la sub-cadena que coincidió con la iteración final. Por ejemplo, luego de que (tweedle[dume]{3}\s*)+ ha coincidido con "tweedledum tweedledee" el valor de la sub-cadena capturada es "tweedledee". Sin embargo, si hay sub-patrones de captura anidados, los valores capturados correspondientes pueden haber sido definidos en las iteraciones anteriores. Por ejemplo, después de que /(a|(b))+/ coincide con "aba", el valor de la segunda sub-cadena capturada es "b".


Pues a simple vista no hay forma, tendría que hacer 1 regex que me valide todo el contenido y otra que me la separe, o, como habia hecho anteriormente... una que la separe y luego unirla y compararla con la cadena original, si no es igual es porque hay un error...

De todas formas si consigues otra manera let me know please :)

Happy weekend

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox

 

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