preg_replace:在反向引用后添加数字

12

情况

我想使用preg_replace()在每个[aeiou]后面添加数字'8'

例子

来自

abcdefghij

to

a8bcde8fghi8j


问题

我应该如何编写替换字符串?

// input string
$in = 'abcdefghij';

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

这只是一个例子,因此建议使用 str_replace() 并不是一个有效的答案。
我想知道如何在替换字符串中的反向引用后面加上数字。

2个回答

30

解决方案是将反向引用包含在${}中。

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

这将输出a8bcde8fghi8j

有关具有反向引用的特殊情况,请参阅手册


3
谢谢;下次在提问之前我应该先阅读说明书。 - MightyPork
好的。只要保证不放弃问有效的问题(就像这个)。我们通过质疑来学习,这次,我想你得到了比试错快10倍的答案。肯定有人知道解决方案... ;) - Xyz
事实上,在发布后,我去了php.net,并找到了答案。当你让我免于回答时,我已经在写自己的答案了 ;) - MightyPork
3
注意单引号。"${1}8"不能使用,因为双引号字符串在 PHP 中被解析/解释,因此大括号会在字符串传递给函数之前“消失”。 - Mr Tsjolder

5
你可以这样做:
$out = preg_replace('/([aeiou])/', '${1}' . '8', $in);

以下是关于反向引用的相关说明:

当使用替换模式,并且一个反向引用紧接着后面的是数字时(即:将一个字面上的数字紧接着放在匹配的模式后面),你不能使用熟悉的 \1 记号来引用反向引用。例如,在 \1 后面直接写数字 1,会让 preg_replace() 搞不清楚您是要 $1 反向引用加上一个字面上的 1,还是要引用 $11,因为它不知道您想要什么。在这种情况下,解决方案是使用 \${1}1,这样就创建了一个隔离的 $1 反向引用,并将 1 保留为字面值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接