我有一个由数字组成的字符串,有时是字母。
示例AF-1234
或345ww
。
我必须得到数字部分并将其递增一 我怎样才能做到这一点?也许正在使用正则表达式?
答案 0 :(得分:28)
您可以将preg_replace_callback
用作:
function inc($matches) {
return ++$matches[1];
}
$input = preg_replace_callback("|(\d+)|", "inc", $input);
基本上,您使用正则表达式\d+
匹配字符串的数字部分,并将其替换为回调函数返回的值,该函数返回递增的值。
或者,可以使用preg_replace()
将e
修饰符设为:
$input = preg_replace("|(\d+)|e", "$1+1", $input);
答案 1 :(得分:6)
如果字符串以数字字符结尾,就这么简单......
$str = 'AF-1234';
echo $str++; //AF-1235
与'345ww'的工作方式相同,但结果可能不是您所期望的。
$str = '345ww';
echo $str++; //345wx
@ tampe125
如果递增以数字结尾的字符串,此示例可能是满足您需求的最佳方法。
$str = 'XXX-342';
echo $str++; //XXX-343
答案 2 :(得分:4)
这是一个通过对值
进行预增量为我工作的示例$admNo = HF0001;
$newAdmNo = ++$admNo;
以上代码将输出HF0002
答案 3 :(得分:0)
这里有一些Python代码可以满足您的要求。我的PHP不太好,但我会看看能不能为你转换它。
>>> import re
>>> match = re.match(r'(\D*)(\d+)(\D*)', 'AF-1234')
>>> match.group(1) + str(int(match.group(2))+1) + match.group(3)
'AF-1235'
答案 4 :(得分:0)
如果您正在处理具有多个数字部分的字符串,那么使用正则表达式解决起来并不容易,因为您可能会有数字从一个数字部分溢出到另一个数字部分。
例如,如果您的号码INV00-10-99
应增加到INV00-11-00
。
我最终得到了以下内容:
for ($i = strlen($string) - 1; $i >= 0; $i--) {
if (is_numeric($string[$i])) {
$most_significant_number = $i;
if ($string[$i] < 9) {
$string[$i] = $string[$i] + 1;
break;
}
// The number was a 9, set it to zero and continue.
$string[$i] = 0;
}
}
// If the most significant number was set to a zero it has overflowed so we
// need to prefix it with a '1'.
if ($string[$most_significant_number] === '0') {
$string = substr_replace($string, '1', $most_significant_number, 0);
}
答案 5 :(得分:0)
这类似于上面的答案,但包含内联代码并对最后一个字符进行全面检查。
function replace_title($title) {
$pattern = '/(\d+)(?!.*\d)+/';
return preg_replace_callback($pattern, function($m) { return ++$m[0]; }, $title);
}
echo replace_title('test 123'); // test 124
echo replace_title('test 12 3'); // test 12 4
echo replace_title('test 123 - 2'); // test 123 - 3
echo replace_title('test 123 - 3 - 5'); // test 123 - 3 - 6
echo replace_title('123test'); // 124test