如何在PHP中查找,增加和替换?

时间:2010-11-17 22:49:16

标签: php regex preg-replace backreference

我有\d+_\d+形式的字符串,我想在第二个数字中添加1。由于我的解释非常清楚,让我举几个例子:

  • 1234567_2应成为1234567_3
  • 1234_10应该变成1234_11

这是我的第一次尝试:

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)$2)+1, $old);

这会导致语法错误:

  

解析错误:语法错误,意外   T_LNUMBER,期待T_VARIABLE或'$'   在[...] 201行

这是我的第二次尝试

$new = preg_replace("/(\d+)_(\d+)/", "$1_".("$2"+1), $old);

这会将$ old = 1234567_2转换为$ new = 1234567_1,这不是预期的效果

我的第三次尝试

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)"$2"+1), $old);

这也是同样的结果。

通过做这些尝试,我意识到我不明白新的$ 1,$ 2,$ 3,..变量是如何工作的,所以我真的不知道还有什么可以尝试,因为看起来这些变量似乎不再在退出preg_replace函数时存在......

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

$new = preg_replace("/(\d+)_(\d+)/e", '"$1_" . ("$2" + 1)', $old);

$1等术语实际上不是变量,它们是preg_replace将在替换文本中解释的字符串。因此,使用基于文本的直接preg_replace无法做到这一点。

但是,正则表达式上的/e修饰符要求preg_replace将替换解释为代码,其中令牌$1等实际上将被视为变量。您将代码作为字符串提供,preg_replace将在适当的上下文中eval()使用其结果作为替换。

答案 1 :(得分:3)

这是PHP 5.3的解决方案(现在当PHP支持lambdas时)

$new = preg_replace_callback("/(\d+_)(\d+)", function($matches)
{
    return $matches[1] . (1 + $matches[2]);
}
, $new);

答案 2 :(得分:0)

使用explode(循序渐进):

$string = "123456_2";

echo $string;

$parts = explode("_", $string);

$lastpart = (int)$parts[1];

$lastpart++;

$newstring = $parts[0] . "_" . (string)$lastpart;

echo $newstring;

这将分隔“_”字符上的字符串,并将第二部分转换为整数。递增整数后,将重新创建字符串。