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 445 Date d'inscription   Statut Membre Dernière intervention   -
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

Groarh Messages postés 682 Date d'inscription   Statut Membre Dernière intervention   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
creadiff Messages postés 445 Date d'inscription   Statut Membre Dernière intervention   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