我有一个字符串“Chicago-Illinos1”,我想在其末尾添加一个,所以它将是“Chicago-Illinos2”。
注意:它也可能是Chicago-Illinos10,我希望它去Chicago-Illinos11,所以我不能做substr。
有什么建议的解决方案吗?
一个非常简单的问题的复杂解决方案......
$str = 'Chicago-Illinos1';
echo $str++; //Chicago-Illinos2
如果字符串以数字结尾,则会递增该数字(例如:'abc123'++ = 'abc124')。
如果字符串以字母结尾,则该字母将递增(例如:'123abc'++ = '123abd')
试试这个
preg_match("/(.*?)(\d+)$/","Chicago-Illinos1",$matches);
$newstring = $matches[1].($matches[2]+1);
(现在无法尝试,但应该可以)
$string = 'Chicago-Illinois1';
preg_match('/^([^\d]+)([\d]*?)$/', $string, $match);
$string = $match[1];
$number = $match[2] + 1;
$string .= $number;
已测试,有效。
爆炸也可以完成这项工作
<?php
$str="Chicago-Illinos1"; //our original string
$temp=explode("Chicago-Illinos",$str); //making an array of it
$str="Chicago-Illinos".($temp[1]+1); //the text and the number+1
?>
我会使用正则表达式来获取字符串末尾的数字(对于Java,它是 [0-9]+$),增加它(int number = Integer.parse(yourNumberAsString) + 1 ),并与 Chicago-Illinos 连接(其余部分与用于查找数字的正则表达式不匹配)。
您可以使用
preg_match
来完成此操作:
$name = 'Chicago-Illinos10';
preg_match('/(.*?)(\d+)$/', $name, $match);
$base = $match[1];
$num = $match[2]+1;
print $base.$num;
将输出以下内容:
Chicago-Illinos11
但是,如果可能的话,我建议在文本和数字之间放置另一个分隔字符。例如,如果您放置了一个管道,您可以简单地执行
explode
并获取数组的第二部分。那就简单多了。
$name = 'Chicago-Illinos|1';
$parts = explode('|', $name);
print $parts[0].($parts[1]+1);
如果字符串长度是一个问题(因此伊利诺伊州的拼写错误),您可以切换到州缩写。 (即
Chicago-IL|1
)
$str = 'Chicago-Illinos1';
echo ++$str;
在不预先隔离数字字符串后缀的情况下,有两种选项可以增加它。
++$string
或 $string++
- 一元运算符允许值的递增和递减
从 PHP8.3 开始,可以以稍微更稳定的行为调用
str_increment()
,但字符串本身必须完全是字母数字。请注意,如果您需要增加字符串数组,则使用这个新的本机函数允许函数迭代器(如 array_map()
)仅通过其名称来调用 str_increment
。
现在是坏消息......
如果整个后缀数字通常会获得另一个数字,这两种技术都会破坏左相邻字符。例如,
a9
将增加到 b0
,而 z99
将变为 aa00
。
如果这还不足以让您担心,那么还存在增加类似于浮点值的字符串值的风险。字符串值
4567e4
将递增到浮点型值 45670001.0
。
阅读手册:https://www.php.net/manual/en/language.operators.increment.php
因为那些“方便”的技术相当不可靠,更好的通用方法是分离、递增和替换数字后缀。
您可以通过调用
preg_replace_callback()
来避免声明临时变量。我推荐这种技术的直接性和稳定性——它总是返回一个字符串。匹配整个数字后缀,递增它,然后用递增后的后缀替换原始后缀。无副作用。
代码:(演示)
$string = 'Chicago41Illinos9';
var_export(
preg_replace_callback(
'/\d+$/',
fn($m) => ++$m[0],
$string
)
);
// Chicago41Illinos10