Как увеличить числовую часть строки на единицу? - PullRequest
15 голосов
/ 30 ноября 2010

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

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

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

Ответы [ 5 ]

28 голосов
/ 30 ноября 2010

Вы можете использовать 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);

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

6 голосов
/ 15 ноября 2011

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

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

То же самое работает с '345ww', хотя результат может быть не таким, как вы ожидаете.

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

@ tampe125

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

$str = 'XXX-342';
echo $str++; //XXX-343
4 голосов
/ 15 декабря 2014

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

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

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

0 голосов
/ 04 мая 2015

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

Например, если у вас есть число 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);
}
0 голосов
/ 30 ноября 2010

Вот код 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...