2016-03-30 105 views
1

好像這應該是簡單的,但下面的代碼不工作:的PHP的preg_replace

$text = preg_replace('/test([0-9]+)/i', $array["$1"], $text); 

的代碼應該找到,如「test1的」,「TEST2」所有情況下,「 test3'等,並替換$ array [1],$ array [2],$ array [3]等值。

我在做什麼錯了?

+1

您想使用'preg_replace_callback()'並通過'use()'將數組傳遞給它, – Rizier123

+0

preg_replace的第二個參數需要一個替換字符串,它可以包含$ n形式的引用。這些不是php變量,所以你不能按照你想要的方式使用它們。 – georaldc

回答

3

你需要使用一個回調:

$text = preg_replace_callback('/(test)([0-9]+)/i', 
           function($m) use($array) { return $m[1].$array[$m[2]]; }, 
           $text); 

該函數將匹配和使用與第二擷取小組賽作爲索引數組項串接第一捕獲組的比賽。你可能需要一個if在那裏檢查$array[$m[2]]是否先存在。

另外,您可以使用一個循環:

foreach($array as $key => $val) { 
    $text = str_replace("test$key", "test$val", $text); 
} 
+0

謝謝!輝煌! – Bintz

0

你已經有答案了。這個只是爲了解釋你的假設錯誤。

$1不是第一參數的結果,它是由preg_replace本身使用的佔位符。您的使用也調用命令的優先順序。

換句話說,如果你試試這個代碼:

$text = 'Lorem test8 Dolor'; 
function test($arg) { echo $arg.PHP_EOL; } 
$text = preg_replace('/test([0-9]+)/i', test("$1"), $text); 
echo $text; 

你得到這樣的輸出:

$1 
Lorem Dolor 

正如你所看到的,第一參數計算,然後結果由preg_replace使用:test()函數接收從字面上$1(並以同樣的方式你的數組),而不是8檢索由preg_replace;然後preg_replace用第二個參數中返回的值替換匹配的子字符串:在上述情況下,test()不返回任何內容,因此替換爲空。

有了這個代碼:

function test() { return '[$1]'; } 
$text = preg_replace('/test([0-9]+)/i', test(), $text); 

結果字符串爲:

Lorem [8] Dolor 

因爲test()返回[$1]並且它可以通過preg_replace被用來執行替換。

$array["$1"] = 'Ipsum'; 
$text = preg_replace('/test([0-9]+)/i', $array["$1"], $text); 

的最後文本是:

在特定情況下,如果你有這樣一個場景中僅更換髮生

Lorem Ipsum Dolor 

這不是你想要的結果,但 - 如前所述 - 你已經有了答案......