Verificar y recolectar valor de expresion regular

Iniciado por Shell Root, 29 Mayo 2010, 16:42 PM

0 Miembros y 1 Visitante están viendo este tema.

Shell Root

Bueno, lo que quiero hacer es algo así. Tengo como cadena la siguiente:
Código (bash) [Seleccionar]
:sh:Todavía tenemos posibilidades de clasificarnos, es :sh:difícil,
el panorama :sh:está complicado, pero en eso nos basamos,
: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 (RegExp) [Seleccionar]
/:sh:\w*/

Lo que hace es validar así:
Código (bash) [Seleccionar]
:sh:Todav
:sh:dif
:sh:est
:sh:todav
: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 (php) [Seleccionar]
$txt = ":sh:Todavía tenemos posibilidades de clasificarnos, es :sh:difícil,
el panorama :sh:está complicado, pero en eso nos basamos,
:sh:todavía estamos en la Copa :sh:América y queremos quedarnos";
preg_match_all("/:sh:\w*/", $txt, $captura, PREG_SET_ORDER);
foreach ($captura as $salida){
echo $salida[1];
echo "\n";
}

Resultado:
Código (bash) [Seleccionar]
shellroot@alex-laptop:~/Escritorio$ php PoC.php
sh
sh
sh
sh
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 (bash) [Seleccionar]
shellroot@alex-laptop:~/Escritorio$ php PoC.php
:sh:Todav
:sh:dif
:sh:est
:sh:todav
:sh:Am
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

~ Yoya ~

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 (bash) [Seleccionar]
    shellroot@alex-laptop:~/Escritorio$ php PoC.php
    :sh:Todav
    :sh:dif
    :sh:est
    :sh:todav
    :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 (php) [Seleccionar]

    <?php
    $txt 
    ":sh:Todavia tenemos posibilidades de clasificarnos, es :sh:dificil,
    el panorama :sh:esta complicado, pero en eso nos basamos,
    :sh:todavia estamos en la Copa :sh:America y queremos quedarnos"
    ;
    preg_match_all("/:sh:([a-z\s\,]+)/i"$txt$capturaPREG_SET_ORDER);

    foreach (
    $captura as $salida) {
    echo 
    $salida[1];
    echo 
    "\n";
    }
    ?>


    Salida:
    Código (bash) [Seleccionar]

    yoya@Yoya-desktop:~/Escritorio$ php a.php
    Todavia tenemos posibilidades de clasificarnos, es
    dificil,
    el panorama
    esta complicado, pero en eso nos basamos,

    todavia estamos en la Copa
    America y queremos quedarnos


    Bueno, explico la expresión regular:
    ([a-z\s\,]+)
    uso los corchete para agrupar...
    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.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Shell Root

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
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.