我有\d+_\d+
形式的字符串,我想在第二个数字中添加1。由于我的解释非常清楚,让我举几个例子:
这是我的第一次尝试:
$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函数时存在......
有什么想法吗?
答案 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;
这将分隔“_”字符上的字符串,并将第二部分转换为整数。递增整数后,将重新创建字符串。