2014-01-24 123 views
2

我想問一下,如果可以使用匹配的正則表達式模式來確定數組中的替換,例如preg_replace使用匹配的替換模式

$rpl['brat'] = 'qwerty'; 
$rpl['omri'] = 'asdfgh'; 

$str1 = 'abc brat bca'; 
$str2 = 'abc omri bca'; 

print_r(preg_replace('#bc (.+?) bc#'), $rpl[$1], $str1)); // aqwertya 
print_r(preg_replace('#bc (.+?) bc#'), $rpl[$1], $str2)); // aasdfgha 

現在很明顯$1是不正確的語法,但這只是爲了證明我做了點。我怎樣才能做到這一點?

+0

也許使用'eval'? – devnull

+1

@devnull燃燒地獄提示。 –

+0

那麼升級很快 –

回答

3

使用preg_replace_callback與修改的正則表達式:

$rpl['brat'] = 'qwerty'; 
$rpl['omri'] = 'asdfgh'; 

$str1 = 'abc brat bca'; 
$str2 = 'abc omri bca'; 

print_r(preg_replace_callback('/bc (\w+) bc/', function($match) use($rpl) { 
    return $rpl[$match[1]]; 
}, $str1)); // => abc qwerty bca 

print_r("\n"); 

print_r(preg_replace_callback('/bc (\w+) bc/', function($match) use($rpl) { 
    return $rpl[$match[1]]; 
}, $str1)); // => aqwertya 

輸出:

abc qwerty bca 
aqwertya 
+0

爲什麼你需要修改正則表達式 –

+0

@php_nub_qq,'(+?)'是無效的正則表達式。 '+'需要前面的模式。我用'\ w'來匹配任何單詞字符。 – falsetru

+0

是的,我剛剛看到我錯過了點,對不起。 –

0

也可以使用標誌 'E',但不推薦,因爲它可能會導致安全問題

print_r(preg_replace('/bc (.+?) bc/e', '$rpl[$1]', $str1)); 
print_r(preg_replace('/bc (.+?) bc/e', '$rpl[$1]', $str2));