2010-09-09 66 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