Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/07/2006, 18h05   #1
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
Par défaut preg_match : je ne comprends pas

Bonjour,

désolé, ma question risque de paraitre un peu stupide, mais je ne comprend vraiment pas le comportement de preg_match_all()...

Je récupère une chaine de caractère contenant des marqueurs que je doit remplacer par des chaines de caracteres.

J'essaye donc d'utiliser la fonction preg_match_all, mais je n'arrive vraiment pas a comprendre comment ça marche.

Je fait des 1er test pour essayer de recupérer dans un premier temps toutes les valeurs numérique d'une chaine de caractère.

j'ai donc écrit :

Code :
$nb = preg_match_all("#([0-9]*?)#i", $text, $ret, PREG_PATTERN_ORDER);
ce qui ne marche évidemment pas du tout... $nb me retourne des chiffres bizars, et ret ne semble rien contenir...

J'ai fait des tas de test pour essayer de comprendre comment cela fonctionnait, mais rien a faire (je post pas mes tests ici, inutils et trop nombreux... La version posté ici est une version parmis tant d'autre).

Quelqun pourrait-il m'expliquer ce qui ne vas pas la dedans ?
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 18h14   #2
Membre confirmé
 
Inscription : février 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 493
Points : 207
Points : 207
Copaing !!

Alors de ce que j'ai compris de preg_matches_all, pour afficher, il te suffit de faire print_r($ret)

Il te sortira tous les résultats qui correspondent à ton expression régulière

Le résultat est sous forme de array donc normal que ce soit pas très lisible
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 18h16   #3
Membre chevronné
 
Avatar de stunti
 
Inscription : mai 2006
Messages : 521
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : mai 2006
Messages : 521
Points : 602
Points : 602
il nous faudrait un extrait du texte source pour voir ce qui tne fonctionne pas.
__________________
If it's not broken, don't fix it.
BiliBa Built on top of Zend Framework
stunti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 19h56   #4
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
Arf, j'ai trouvé la solution... enfin je veux dire la solution a mon problème dans l'ensemble... En fait, j'avais une chaine de caractere contenant des "marqueurs" contenant eux même des valeurs. Suivant le marqueur trouvé, j'applique la valeur qu'il contient en paramètre à une fonction.

par exemple, j'ai un marqueur [#£{num}£#] ou {num} est une valeur numérique, et [#£ et £#] le marqueur (qui définit la fonction a appeler).
La solution a mon problème ne passes pas par un preg_match(), mais par un preg_replace().

Voici un code d'exemple ré-écrit en esperant qu'il pourra aider du monde :

Code :
1
2
3
4
5
6
7
8
9
10
 
                function transforme($val)
                {
                        return '<font color="red">'.$val.'</font>';
                }
 
                $text = 'ceci est [#£1£#] et cela est [#§25§#]...';
 
                $text = preg_replace("#(\[\#£)([0-9]*?)(£\#\])#is", transforme('\\2'), $text);
                echo $text;
qui aura pour effet de remplacer les [#£{num}£#] par la valeur {num} affichée en rouge.

En développant un peu, j'imagine qu'on doit pouvoir ecrire (toujours pour exemple ludique, et donc non testé)

Code :
1
2
3
4
5
6
7
8
9
10
11
 
                function transforme($couleur, $val)
                {
                        return '<font color="'.$couleur.'">'.$val.'</font>';
                }
 
                $text = 'ceci est [CC:green,25]...';
 
                $text = preg_replace("#(\[CC:)(red|green|blue),([0-9]*?)(\])#is", transforme('\\2', '\\3'), $text);
 
                echo $text;
pour remplacer par exemple dans $text la chaine [CC:green,25] par <font color="green">25</font>

Ce qui par déduction explique les currieux tableaux (preg_match_all) que j'ai obtenu a l'aide du post de trihanchcie qui doivent ainsi contenir :

Code :
1
2
 
$tebleau[{numero de la parenthese}][{index du debut de la chaine dans le texte}
Je rappel pour ceux qui lisent ce post en esperant y voir plus clair sur les preg que le '\\2' que je passe en parametre a ma fonction signifie "2eme parenthese contenant l'expression qui correspond exactement a mon filtre".
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 20h28   #5
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
(re-)Arf...
Bha voila, je penais avoir compris et que la suite serait du gateau, et vlan... nouveau problème...

Code :
1
2
3
4
5
6
 
        function DOC($text)
        {
                $text = preg_replace("#(\[\#§)([0-9]*?)(§\#\])#is", $this->ShowTab('\\2'), $text);
                return $text;
        }
Je colle le code que j'avais testé (le 1er code de mon dernier post) un peu plus haut dans une classe, et voilà que ca marche plus...

Résultat, ma method $this->ShowTab() reçoie en paramètre '\2'... (j'ai testé avec simple et double quote) au lieu de recevoir la valuer numérique contenue dans mon marqueur...

Il n'a donc visiblement pas interprété le symbole '\\2' comme il aurait du...

Quelqun a une explication ? cela peut-il être lié au fait que je soit dans une class ?

(PS : j'obtient le meme resultat en ecrivant une fonction transfrome DANS la fonction DOC())
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 21h28   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Dans certaines situations, il est préférable d'utiliser preg_replace_callback() dont tu pourras trouver un exemple d'utilisation ici :

http://g-rossolini.developpez.com/tu...ns-regulieres/
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 21h36   #7
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
merci, j'essaye ça tout de suite
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 21h51   #8
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
J'ai pas utiliser le callback, car avec l'option 'e', la méthode ci-dessous fonctionne :

Code :
$text = preg_replace("#(\[\#§)([0-9]*?)(§\#\])#ise", "\$this->ShowTab('\\2')", $text);
Donc un immense merci pour l'indication qui m'aura mis sur la bonne voie ^^

pb résolu
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h36.


 
 
 
 
Partenaires

Hébergement Web