Как увеличить числовую часть строки на единицу?

У меня есть строка, образованная цифрами, а иногда и буквами.

Пример AF-1234 или 345ww .

Я должен получить числовую часть и увеличить ее на единицу.
Как мне это сделать? возможно, с регулярным выражением?

Вы можете использовать preg_replace_callback как:

 function inc($matches) { return ++$matches[1]; } $input = preg_replace_callback( "|(\d+)|", "inc", $input); 

В основном вы сопоставляете числовую часть строки с помощью regex \d+ и заменяете ее значением, возвращаемым функцией обратного вызова, которая возвращает значение с добавочным значением.

Идеальная ссылка

В качестве альтернативы это можно сделать, используя preg_replace с e модификатором как:

  $input = preg_replace( "|(\d+)|e", "$1+1", $input); 

Идеальная ссылка

Вот пример, который работал для меня, делая предварительный приращение на значении

 $admNo = HF0001; $newAdmNo = ++$admNo; 

Вышеприведенный код выводит HF0002

Если строка заканчивается числовыми символами, это просто …

 $str = 'AF-1234'; echo $str++; //AF-1235 

Это работает так же, как и «345», хотя результат может и не быть тем, что вы ожидаете.

 $str = '345ww'; echo $str++; //345wx 

@ tampe125

Этот пример, вероятно, лучший метод для ваших потребностей, если увеличивать строку, заканчивающуюся цифрами.

 $str = 'XXX-342'; echo $str++; //XXX-343 

Вот код 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' 

Если вы имеете дело со строками, которые имеют несколько частей, то это не так просто решить с помощью регулярного выражения, поскольку у вас могут быть числа, переполненные из одной числовой части в другую.

Например, если у вас есть номер 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); }