IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

preg_match : je ne comprends pas [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 ?

  2. #2
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Par défaut
    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

  3. #3
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    il nous faudrait un extrait du texte source pour voir ce qui tne fonctionne pas.

  4. #4
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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".

  5. #5
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    (re-)Arf...
    Bha voila, je penais avoir compris et que la suite serait du gateau, et vlan... nouveau problème...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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())

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur Objet requis : 'this' --> Comprend pas!!
    Par Grozeil dans le forum ASP
    Réponses: 3
    Dernier message: 30/03/2005, 09h46
  2. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  3. sql ne comprend pas mon where!et me demande des parametres
    Par marie10 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/04/2004, 11h08
  4. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo