Page 1 sur 1

Encore un problème avec preg_replace_callback

Posté : 26 juin 2008, 18:45
par katagoto
Bonjour à toutes et tous,

Voilà, j'aimerais remplacé :user: d'une partie html, j'ai donc pensé à ça :
<?php
// Fonction qui va parser le modèle
function parse($contenu){
	return preg_replace_callback("#:[a-zA-Z0-9]+:#i", 'cherche_variable', $contenu);
}
// Fonction qui va remplacer les variables trouvés
function cherche_variable($matches){
	global $liste_variables;
	return $liste_variables[$matches[1]];
}

$liste_variables=array();
$liste_variables['user']="katagoto";

ob_start("parse");
?>
<html>
<body>
<p>Bien joué :user:</p>
</body>
</html>
<?php
ob_end_flush();
?>
ça viendrait d'une de mes fonctions, mais je ne vois pas où...

Par avance merci de vos réponses...

Posté : 26 juin 2008, 18:58
par savageman
T'as pas de parenthèses capturante, il ne risque pas d'y avoir quelque chose dans $matches[1] :)

De plus, dans la fonction de callback, je te conseille de vérifier que la clé existe bien avant de faire return, comme ça si elle n'existe pas, tu peux faire un return $matches[0] (la chaîne originale).

Posté : 26 juin 2008, 19:02
par katagoto
Oui, j'y pensais, mais pour pas allourdir le script :
function cherche_variable($matches){
	global $liste_variables;
	if (array_key_exists($matches[1], $liste_variables)) return $liste_variables[$matches[1]];
	else diie ("la variable <b>".$matches[1]."</b> n'est pas définie");
}
Voilà le code final :
<?php
// Fonction qui va parser le modèle
function parse($contenu){
	return preg_replace_callback("#:([a-zA-Z0-9]+):#i", 'cherche_variable', $contenu);
}
// Fonction qui va remplacer les variables trouvés
function cherche_variable($matches){
	global $liste_variables;
	if (array_key_exists($matches[1], $liste_variables)) return $liste_variables[$matches[1]];
	else diie ("la variable <b>".$matches[1]."</b> n'est pas définie");
}

$liste_variables=array();
$liste_variables['user']="katagoto";

ob_start("parse");
?>
<html>
<body>
<p>Bien joué :user:</p>
</body>
</html>
<?php
ob_end_flush();
?>
Et ça marche niquel ;)