2010-09-09 3 views
0

pourquoi ce code ne fonctionne pas?preg_replace/e et tableau

$mx['foo'] = "vvv"; 
$string = "foo is foobar, baz is widgets"; 
echo preg_replace("/(foo)/ei", "$mx[('\\1')]", $string); 

la sortie doit aimer ce

VVV est vvvbar, baz est des widgets

Répondre

3

Parce que vous utilisez des guillemets doubles dans preg_replace, PHP tente d'utiliser votre valeur $mx directement, qui produit alors une erreur. ..

échapper simplement le $mx, et il fonctionnera:

echo preg_replace("/(foo)/ei", "\$mx[('\\1')]", $string); 

Ou vous pouvez faire la même chose en utilisant des guillemets simples:

echo preg_replace("/(foo)/ei", '$mx[(\'\\1\')]', $string); 
+0

Sa sortie ne serait-elle pas '' $ mx [('foo')] est $ mx [('foo')] barre, baz est widgets "' alors? – jwueller

0

Votre preg_replace utilise des guillemets doubles, qui sont interprétées par PHP. Il ne semble pas que vous ayez besoin d'une configuration aussi complexe, puisque c'est un simple remplacement de chaîne, pour autant que je puisse le voir. Une solution plus simple serait:

$string = str_replace('foo', 'vvv', $string); 

Vous pouvez utiliser votre tableau aussi:

$replacements = array(
    'foo' => 'vvv' 
); 
foreach ($replacements as $key => $replacement) { 
    $string = str_replace($key, $replacement, $string); 
} 

Cela remplacerait toutes les clés du tableau donné avec les valeurs associées.

+0

Vous pouvez passer des tableaux de clés/remplacements à 'str_replace', alors vous n'avez pas besoin d'utiliser la boucle' foreach' – Laimoncijus

+0

Mais cela impliquerait deux tableaux, non? Ce n'est pas très pratique ici, car les garder synchronisés est une chose supplémentaire à retenir. – jwueller

+1

vous pouvez toujours avoir un seul tableau de remplacement associatif comme dans votre exemple, juste obtenir des clés/valeurs en conséquence: 'preg_replace (array_keys ($ remplacements), array_values ​​($ remplacements), $ string)' – Laimoncijus