2013-08-02 48 views
7

形勢的preg_replace:反向引用

我想用preg_replace()每個[aeiou]後添加一個數字'8'後添加數。

abcdefghij 

a8bcde8fghi8j 


問題

我應該如何編寫替換字符串?

// input string 
$in = 'abcdefghij'; 

// this obviously won't work ----------↓ 
$out = preg_replace('/([aeiou])/', '\18', $in); 

這是只是一個例子,所以建議str_replace()不是一個有效的答案。
我想知道如何在替換字符串中反向引用後有數字。

回答

18

解決方法是將反向引用包含在${}中。

$out = preg_replace('/([aeiou])/', '${1}8', $in); 

將輸出a8bcde8fghi8j

the manual與反向引用這種特殊情況。

+2

謝謝;在下次詢問之前,我應該RTFM。 – MightyPork

+0

好的。只是承諾不要放棄提出有效的問題(比如這個問題)。我們通過提問來學習,而這一次,我想你的答案比通過反覆試驗快了10倍。有人必然知道解決方案...;) –

+0

事實上,張貼後,我去了php.net,並*找到答案*。我已經寫了自己的答案,當你免除我自己回答的羞恥;) – MightyPork

4

你可以這樣做:

$out = preg_replace('/([aeiou])/', '${1}' . '8', $in); 

Here is a relevant quote from the docs regarding backreference:

當替換模式在一個逆向引用後面緊接着另一個號碼工作(即:一個匹配的模式後立即發出文字數),您不能使用熟悉的\ 1符號作爲反向引用。例如,\ 11會混淆preg_replace(),因爲它不知道您是否希望\ 1反向引用後跟一個文字1,或\ 11反向引用後面什麼都不是。在這種情況下,解決方案是使用\ $ {1} 1。這會創建一個單獨的$ 1反向引用,將1作爲文字。