Récupérer une ou plusieur occurrence : PHP

le_joker_fou Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   -  
creadiff Messages postés 483 Statut Membre -
Bonjour,

Voilà un exemple de chaine :

"Bonjour,

Votre nom est : %user.nom%
Votre prénom est : %user.prenom%"

Je voudrais récupérer les occurrences %user.nom% et %user.prenom% pour les traiter, or je ne vois pas comment faire.

J'ai essayé ceci : $Texte = eregi ("%(.*)%" , $corps, $Resultat);

Mais le résultat est le suivant : "user.nom% Votre prénom est : %user.prenom"

Si quelqu'un a une idée je suis preneur.

Merci d'avance.

2 réponses

  1. Groarh Messages postés 706 Statut Membre 185
     
    Salut,
    un peu de théorie sur les RegExp : l'étoile * est gloutonne (greedy), c'est-à-dire qu'elle va essayer de capturer la plus grande portion de texte qui correspond au pattern. C'est pour ça que tu récupères tout ce qu'il y a entre le premier et le dernier %.

    Pour la rendre non gloutonne (ungreedy ou encore lazy), il suffit de rajouter un point d'interrogation :
    $Texte = eregi ("%(.*?)%" , $corps, $Resultat); 

    L'autre solution, plus optimisée, est d'interdire le symbole % dans le pattern :
    $Texte = eregi ("%([^%]*)%" , $corps, $Resultat); 

    ;)
    0
  2. creadiff Messages postés 483 Statut Membre 57
     
    Pour récupérer toutes les occurrences, preg_match_all est plus pratique :

    preg_match_all("%([^%]+)%" , $corps, &$resultats);
    foreach ($resultats[1] as $resultat){
        $corps = str_replace("%$resultat%", $param[$resultat], $corps);
    }
    

    (en supposant que les paramètres que tu utilisent se trouvent dans $param)

    Le "+" est plus adapté qu' "*", car il s'agit des occurrences où il y a au moins un caractère entre les "%".
    0