How to increment numeric part of a string by one?

I have a string formed up by numbers and sometimes by letters.

Example AF-1234 or 345ww.

I have to get the numeric part and increment it by one.
how can I do that? maybe with regex?

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

You can use preg_replace_callback as:

function inc($matches) {
    return ++$matches[1];
}

$input = preg_replace_callback("|(\d+)|", "inc", $input);

Basically you match the numeric part of the string using the regex \d+ and replace it with the value returned by the callback function which returns the incremented value.

Ideone link

Alternatively this can be done using preg_replace() with the e modifier as:

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

Ideone link

Solution 2

If the string ends with numeric characters it is this simple…

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

That works the same way with ‘345ww’ though the result may not be what you expect.

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

@tampe125

This example is probably the best method for your needs if incrementing string that end with numbers.

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

Solution 3

Here is an example that worked for me by doing a pre increment on the value

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

The above code will output HF0002

Solution 4

If you are dealing with strings that have multiple number parts then it’s not so easy to solve with regex, since you might have numbers overflowing from one numeric part to another.

For example if you have a number INV00-10-99 which should increment to INV00-11-00.

I ended up with the following:

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);
}

Solution 5

Here’s some Python code that does what you ask. Not too great on my PHP, but I’ll see if I can convert it for you.

>>> 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'

Solution 6

This is similar to the answer above, but contains the code inline and does a full check for the last character.

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

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply