Preg_replace的行为不符合我的预期

时间:2014-12-04 20:00:26

标签: php preg-replace

我认为这是一个简单的preg_replace,但却引起了一些问题。

输入
Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/[1]

替换
preg_replace("/\[(\d+)\]/", "\$(${1})", $output);

预期输出
Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/$(1)

这样做的目的是从旧的API转移到新的API - [1]可以在输入字符串中的任何位置

我遇到的问题是这是输出
Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/$()
并且似乎忽略了捕获组

编辑: 通过将替换更改为
来解决 preg_replace('#\[(\d+)\]#', '\$(${1})', $output);

1 个答案:

答案 0 :(得分:1)

你几乎做对了。这对我来说很重要:

$output = 'Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/[1]';
$new_output = preg_replace("/\[(\d+)\]/", "\$($1)", $output);

print($new_output."\n");

使用大括号,您可以插入一个PHP变量,并将其与替换文本分开,如此

$php_var = 'replacement';
$output = 'Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/[1]';
$new_output = preg_replace("/\[(\d+)\]/", "\$(${php_var}_and_then_some)", $output);

print($new_output."\n");