2

我在表单中有字符串,\d+_\d+我想在第二个数字上加 1。既然我的解释很清楚,让我举几个例子:

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

这是我的第一次尝试:

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

这会导致语法错误:

解析错误:语法错误,意外的 T_LNUMBER,在第 201 行的 [...] 中需要 T_VARIABLE 或 '$'

这是我的第二次尝试

$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 函数...

有任何想法吗?

4

3 回答 3

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

etc术语$1实际上不是变量,它们是preg_replace将在替换文本中解释的字符串。所以没有办法使用直接基于文本的preg_replace.

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

于 2010-11-17T22:53:10.450 回答
3

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

$new = preg_replace_callback("/(\d+_)(\d+)", function($matches)
{
    return $matches[1] . (1 + $matches[2]);
}
, $new);
于 2013-08-12T10:40:58.723 回答
0

使用explode(逐步):

$string = "123456_2";

echo $string;

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

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

$lastpart++;

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

echo $newstring;

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

于 2010-11-17T22:54:24.757 回答