Page 1 sur 1

Regex : insersion de la capture dans une variable

Posté : 22 août 2013, 19:26
par AinaB
Bonjour à tous,
ceci est mon premier post et le titre est déjà pas très clair, désolé !

Le problème que je rencontre est le suivant : je cherche à convertir une chaîne de type "blablabla [exp1.truc] blablabla" en "blablabla $var['exp1.truc'] blablabla", où la variable $var s'affiche directement (par exemple "blablabla blo blablabla" si $var['exp1.truc']=="blo").

J'ai essayé plusieurs variantes de ce genre :
 $texte = preg_replace('#\[((exp1|exp2|exp3)\.[a-zA-Z0-9]+)\]#isU', $var['$1'], $texte);
 $texte = preg_replace('#\[((exp1|exp2|exp3)\.[a-zA-Z0-9]+)\]#isU', $var['"$1"'], $texte); /*( " dans ' )*/
 $texte = preg_replace('#\[((exp1|exp2|exp3)\.[a-zA-Z0-9]+)\]#isU', $var["'$1'"], $texte); /*( ' dans " )*/
 $texte = preg_replace('#\[((exp1|exp2|exp3)\.[a-zA-Z0-9]+)\]#isU', $var['"'.'$1'.'"'], $texte);
...et peut-être d'autres que j'ai oubliées, mais à chaque fois en reprenant l'exemple ça ne m'affiche que "blablabla blablabla", même si $var[...] est bien renseigné.

J'espère qu'avec mon explication et mes exemples vous voyez à peu près ce que je souhaite obtenir, c'est pas simple à expliquer ^^

Toutes les recherches que j'ai faites sur le net en rapport avec des variables et des regexp m'ont menées à des problèmes liés aux variables dans l'expression même, et non dans le remplacement.

Est-ce que quelqu'un a déjà rencontré ce cas de figure et peut m'expliquer comment il s'en est sorti ?

Merci d'avance !

Re: Regex : insersion de la capture dans une variable

Posté : 23 août 2013, 13:42
par AinaB
Eh bien figurez-vous que j'ai trouvé !
Le problème que j'avais est que je cherchais une erreur de syntaxe dans la façon où j'essayais d'utiliser ma variable... mais je n'utilisais tout simplement pas les bonnes fonctions.

Voici ce que j'ai fait pour que ça fonctionne, si ça en intéresse :

Au lieu de ça :
$texte = preg_replace('#\[((exp1|exp2|exp3)\.[a-zA-Z0-9]+)\]#isU', $var['$1'], $texte);
/* et autres variantes plus ou moins détaillées dans le premier post */
Il faut faire ça :
$texte = preg_replace_callback('#\[((exp1|exp2|exp3)\.[a-zA-Z0-9]+)\]#isU', 'varInterpretation', $texte);
function varInterpretation($varNom) {
	global $var; /*Ma variable est déjà définie à l'extérieur de cette fonction*/
	return $var[$varNom[1]];
}
J'ai donc découvert la fonction preg_replace_callback() que je ne connaissais pas ! :)