替换字符串中带有变量的preg_replace()会占用第一个字符

时间:2014-04-26 17:29:57

标签: php preg-replace

我正在尝试替换版本字符串,但它总是吃掉我的拳头字母字符串,直到我在其间放置一个空格:Version:$1 $new_version

但我不想这样做,并想了解这里发生的事情。

文件内容:

Version:    4.4.4

我的代码的相关部分:

$new_version = 6.6.6
$new_main_file_content = preg_replace(
    '/Version:([ ]*)[0-9\.]+/', 
    "Version:$1$new_version", 
    file_get_contents($main_file) 
);

如果没有空格,则输出为Version:.6.6,并且输出正确,但只有一个空格太多。我也试过使用花括号,但是......没有运气。

1 个答案:

答案 0 :(得分:4)

这是一个替代品。来自PHP manual documentation on preg_replace()

  

当使用替换模式时,后向引号后面紧跟另一个数字(即:在匹配的模式后立即放置一个文字数字),您不能使用熟悉的\\1表示法进行反向引用。例如,\\11会混淆preg_replace(),因为它不知道您是否希望\\1反向引用后跟文字1\\11后引用没什么。在这种情况下,解决方案是使用\${1}1。这会创建一个孤立的$1反向引用,将1保留为文字。

这应该做你想要的:

preg_replace( '/Version:([ ]*)[0-9\.]+/', 'Version:${1}'.$new_version, ...);

Demo