2010-09-09 53 views
0

为什么这段代码不起作用?preg_replace/e和数组

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

输出必须喜欢这个

VVV是vvvbar,巴兹是小部件

回答

3

,因为你在preg_replace使用双引号,PHP会尝试直接使用你的$mx值,然后产生误差。 ..

只需逃脱$mx,然后它会工作:

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

或者你也可以做到用单引号一样:

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

他的输出是不是'“$ mx [('foo')]是$ mx [('foo')] bar,baz是widgets”'then? – jwueller 2010-09-09 16:56:44

0

preg_replace使用双引号,这是由PHP解释。它看起来并不像你需要这样一个复杂的设置,因为这是一个简单的字符串替换,据我所知。一个简单的解决办法是:

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

你可以使用你的阵列,也:

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

这将替换为关联值给定阵列中的所有键。

+0

你可以将键/替换数组传递给'str_replace',那么你不需要使用'foreach'循环 – Laimoncijus 2010-09-09 16:33:39

+0

但是这意味着两个数组,对吗?这在这里不是很方便,因为保持它们的同步是一件值得记住的事情。 – jwueller 2010-09-09 16:38:35

+1

你仍然可以像你的例子那样拥有单个关联替换数组,只需获取键/值:'preg_replace(array_keys($ replacements),array_values($ replacements),$ string)' – Laimoncijus 2010-09-09 21:08:05