我在表单\d+_\d+
中有字符串,我想将1添加到第二个数字中。既然我的解释很清楚,让我举几个例子:
1234567_3
这是我的第一次尝试:
$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函数时就不再存在了……
有什么想法吗?
发布于 2010-11-17 14:53:10
$new = preg_replace("/(\d+)_(\d+)/e", '"$1_" . ("$2" + 1)', $old);
$1
等术语实际上不是变量,它们是preg_replace
将在替换文本中解释的字符串。因此,使用直接基于文本的preg_replace
是无法做到这一点的。
但是,正则表达式上的/e
修饰符要求preg_replace
将替换解释为代码,其中令牌$1
等实际上将被视为变量。您可以以字符串的形式提供代码,preg_replace
将在适当的上下文中使用其结果作为替换,在适当的上下文中使用eval()
。
发布于 2013-08-12 02:40:58
以下是PHP5.3的解决方案(现在PHP支持lambdas)
$new = preg_replace_callback("/(\d+_)(\d+)", function($matches)
{
return $matches[1] . (1 + $matches[2]);
}
, $new);
发布于 2010-11-17 14:54:24
使用explode
(逐步):
$string = "123456_2";
echo $string;
$parts = explode("_", $string);
$lastpart = (int)$parts[1];
$lastpart++;
$newstring = $parts[0] . "_" . (string)$lastpart;
echo $newstring;
这将分隔"_“字符上的字符串,并将第二部分转换为整数。在递增整数之后,将重新创建字符串。
https://stackoverflow.com/questions/4209978
复制相似问题