par
Vaedan » 05 mai 2006, 10:39
Bonjour, tu as raison, je suis allé un peu vite. Je vais détailler
Un expression régulière PCRE (pour preg et non ereg) doit être encadrée. Ici j'ai utilisé des slashes
/ mais j'aurais très bien pû mettre un
#, cela ne change rien !
/expression/ ou #expression#
L'accent circonflexe (hu ?)
^ indique que l'expression doit commencer à chercher au début de la chaîne.
Ensuite ce trouve un sous-masque. Ce dernier permet d'identifier des parties de l'expression sans les considérer comme des parties recherchées. Il a les même propriété que le masque 'simple' basé avec les parenthèses.
/^(?:debut)/
Vient après le point
. qui désigne "n'importe quel caractère". Il sert de Joker. L'étoile
* indique que le caractère précédent peut être répété à l'infini, ou pas ! Ainsi la combinaison
.* permet de "sélectionner" toute l'expression jusqu'à la prochaine condition.
J'ai par la suite ajouté l'underscore
_. L'expression recherchée est donc une chaine quelqueconque suivie d'un underscore.
/^(?:.*_)/
Ici s'achève le sous masque. L'idée est de répéter ce motif puisque ta variable est de la forme
xxx_yyy_qqch. L'ajout de {n} permet de répéter le motif précédent n fois. Ici le motif est un sous-masque. Il sera donc répété 2 fois. Actuellement notre petit regex identifie
xxx_yyy_. Il ne reste plus qu'à récupérer la fin.
Cette fois-ci on utilise un masque et non-plus un sous-masque, afin de demander à PHP de garder en mémoire ce qu'il va "trouver" via preg_match(). La synthaxe d'un masque est
/(masque)/
On va une fois de plus avoir recours à un Joker
.*. Seulement voila, ce n'est pas fini ! Si on arrête pas la recherche par une autre condition, ici la virgule, tout sera sélectionné. Ainsi notre expression finale devient
/^(?:.*_){2}(.*),/
Maintenant que nous avons l'expression, il nous faut l'appliquer via preg_match().
preg_match( '/^(?:.*_){2}(.*),/', $str, $match );
Si quelquechose est trouvé, nous devons l'extraire ! Et ce de la manière suivante :
$var = $match[1][0];
La première colonne correspond à l'aboutissement du regex, la deuxième aux résultats.
Il y a 2 lignes dans la première colonne :
- $match[0] : chaine de base$match[1] : chaines trouvées
Nous nous rendons donc dans la deuxième colonne afin de récupérer les morceaux extraits par notre regex. Cette colonne contient ici un seul résultat puisque nous n'avons qu'un seul masque. Le sous-masque ne figure pas dedans. Donc :
// première colonne, deuxième ligne
// $match[1]
// deuxième colonne, première ligne
// $match[1][0]
J'espère avoir été assez clair

Bonjour, tu as raison, je suis allé un peu vite. Je vais détailler :)
Un expression régulière PCRE (pour preg et non ereg) doit être encadrée. Ici j'ai utilisé des slashes [b]/[/b] mais j'aurais très bien pû mettre un [b]#[/b], cela ne change rien ![php]/expression/ ou #expression#[/php]
L'accent circonflexe (hu ?) [b]^[/b] indique que l'expression doit commencer à chercher au début de la chaîne.
Ensuite ce trouve un sous-masque. Ce dernier permet d'identifier des parties de l'expression sans les considérer comme des parties recherchées. Il a les même propriété que le masque 'simple' basé avec les parenthèses.[php]/^(?:debut)/[/php]
Vient après le point [b].[/b] qui désigne "n'importe quel caractère". Il sert de Joker. L'étoile [b]*[/b] indique que le caractère précédent peut être répété à l'infini, ou pas ! Ainsi la combinaison [b].*[/b] permet de "sélectionner" toute l'expression jusqu'à la prochaine condition.
J'ai par la suite ajouté l'underscore [b]_[/b]. L'expression recherchée est donc une chaine quelqueconque suivie d'un underscore.[php]/^(?:.*_)/[/php]
Ici s'achève le sous masque. L'idée est de répéter ce motif puisque ta variable est de la forme [color=darkred]xxx_[/color][color=red]yyy_[/color][color=orange]qqch[/color]. L'ajout de {n} permet de répéter le motif précédent n fois. Ici le motif est un sous-masque. Il sera donc répété 2 fois. Actuellement notre petit regex identifie [b]xxx_yyy_[/b]. Il ne reste plus qu'à récupérer la fin.
Cette fois-ci on utilise un masque et non-plus un sous-masque, afin de demander à PHP de garder en mémoire ce qu'il va "trouver" via preg_match(). La synthaxe d'un masque est [php]/(masque)/[/php]
On va une fois de plus avoir recours à un Joker [b].*[/b]. Seulement voila, ce n'est pas fini ! Si on arrête pas la recherche par une autre condition, ici la virgule, tout sera sélectionné. Ainsi notre expression finale devient [php]/^(?:.*_){2}(.*),/[/php]
Maintenant que nous avons l'expression, il nous faut l'appliquer via preg_match().[php]preg_match( '/^(?:.*_){2}(.*),/', $str, $match );[/php]
Si quelquechose est trouvé, nous devons l'extraire ! Et ce de la manière suivante :[php]$var = $match[1][0];[/php]
La première colonne correspond à l'aboutissement du regex, la deuxième aux résultats.
Il y a 2 lignes dans la première colonne :[list][*][b]$match[0] [/b]: chaine de base[b]$match[1] [/b]: chaines trouvées[/list]
Nous nous rendons donc dans la deuxième colonne afin de récupérer les morceaux extraits par notre regex. Cette colonne contient ici un seul résultat puisque nous n'avons qu'un seul masque. Le sous-masque ne figure pas dedans. Donc :[php]// première colonne, deuxième ligne
// $match[1]
// deuxième colonne, première ligne
// $match[1][0][/php]
J'espère avoir été assez clair ;)