Bueno, lo que quiero hacer es algo así. Tengo como cadena la siguiente:
: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)
/:sh:\w*/
Lo que hace es validar así:
: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:
$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:
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!
shellroot@alex-laptop:~/Escritorio$ php PoC.php
:sh:Todav
:sh:dif
:sh:est
:sh:todav
:sh:Am
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:
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:
<?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, $captura, PREG_SET_ORDER);
foreach ($captura as $salida) {
echo $salida[1];
echo "\n";
}
?>
Salida:
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.
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