Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Shell Root en 29 Mayo 2010, 16:42 pm



Título: Verificar y recolectar valor de expresion regular
Publicado por: Shell Root en 29 Mayo 2010, 16:42 pm
Bueno, lo que quiero hacer es algo así. Tengo como cadena la siguiente:
Código
  1. :sh:Todavía tenemos posibilidades de clasificarnos, es :sh:difícil,
  2. el panorama :sh:está complicado, pero en eso nos basamos,
  3. :sh:todavía estamos en la Copa :sh:América y queremos quedarnos

Y tengo la siguiente expresión regular. (Un poco loca, pero funciona)
Código
  1. /:sh:\w*/

Lo que hace es validar así:
Código
  1. :sh:Todav
  2. :sh:dif
  3. :sh:est
  4. :sh:todav
  5. :sh:Am

Lo hace correctamente, pero como hago para recolectar la información que está después de la expresión regular?, es decir, hago esto para intentar hacer lo que quiero, pero solo me toma sh, quisiera recolectar todo lo que cumple la expresión regular. Como los anteriores.

Código:
Código
  1. $txt = ":sh:Todavía tenemos posibilidades de clasificarnos, es :sh:difícil,
  2. el panorama :sh:está complicado, pero en eso nos basamos,
  3. :sh:todavía estamos en la Copa :sh:América y queremos quedarnos";
  4. preg_match_all("/:sh:\w*/", $txt, $captura, PREG_SET_ORDER);
  5. foreach ($captura as $salida){
  6. echo $salida[1];
  7. echo "\n";
  8. }
Resultado:
Código
  1. shellroot@alex-laptop:~/Escritorio$ php PoC.php
  2. sh
  3. sh
  4. sh
  5. sh
  6. sh


Edit: Estaba mirando el código de yoyahack y no se porque puso $salida[1], era $salida[0]. :S Perdón por el POST!
Código
  1. shellroot@alex-laptop:~/Escritorio$ php PoC.php
  2. :sh:Todav
  3. :sh:dif
  4. :sh:est
  5. :sh:todav
  6. :sh:Am


Título: Re: Verificar y recolectar valor de expresion regular
Publicado por: ~ Yoya ~ en 29 Mayo 2010, 18:15 pm
Si usas
  • te responde las coincidencias de todos los patrones, y si usas [1],[2], son los patrones que están entre paracentesis....

Si te fijas que cuando ejecutaste el script el resultado fue:
Código
  1. shellroot@alex-laptop:~/Escritorio$ php PoC.php
  2. :sh:Todav
  3. :sh:dif
  4. :sh:est
  5. :sh:todav
  6. :sh:Am
Usas la meta secuencia \w, que sirve para todos los carácter alfa-numérico pero si te fijas que después de
Todav sigue una í acentuada, no pertenece en tu caso a los carácter alfa-numérico debido al juego de carácter predeterminado que tienes en php...

Puedes hacer muchas cosas, pero las tres primera cosa que se me ocurrieron fueron:
  • Cambiar el juego de carácter.
  • Capturar todo excepto :sh:.
  • Cambiar los carácter acentuados a carácter normales.
  • Eliminar el :sh: de la cadena.

Bueno, para agilizar el proceso, pase a usar la tercera opción... Este es el código que hice:
Código
  1. <?php
  2. $txt = ":sh:Todavia tenemos posibilidades de clasificarnos, es :sh:dificil,
  3. el panorama :sh:esta complicado, pero en eso nos basamos,
  4. :sh:todavia estamos en la Copa :sh:America y queremos quedarnos";
  5. preg_match_all("/:sh:([a-z\s\,]+)/i", $txt, $captura, PREG_SET_ORDER);
  6.  
  7. foreach ($captura as $salida) {
  8. echo $salida[1];
  9. echo "\n";
  10. }
  11. ?>

Salida:
Código
  1. yoya@Yoya-desktop:~/Escritorio$ php a.php
  2. Todavia tenemos posibilidades de clasificarnos, es
  3. dificil,
  4. el panorama
  5. esta complicado, pero en eso nos basamos,
  6.  
  7. todavia estamos en la Copa
  8. America y queremos quedarnos

Bueno, explico la expresión regular:
Código:
([a-z\s\,]+)
uso los corchete para agrupar...
Código:
a-z -> Desde la a hasta la z, aceptamos.
\s -> Aceptamos espacio en blanco.
\, -> Aceptamos la coma.

Y al final uso el operador i para no distinga entre mayúscula y minúscula ( No case sensitive)

Saludos.


Título: Re: Verificar y recolectar valor de expresion regular
Publicado por: Shell Root en 29 Mayo 2010, 18:50 pm
Thanks!, pero como había dicho, hice la ExpReg, de acuerdo a lo que necesitaba, y necesitaba que se mostrará el contenido anterior a la tilde y que al inicio tuviese :sh: :P