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 -
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.
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
-
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);
;) -
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 "%".