2013-08-02 50 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作为文字。