I have strings in the form \\d+_\\d+
and I want to add 1 to the second number. Since my explanation is so very clear, let me give you a few examples:
Use explode
(step-by-step):
$string = "123456_2";
echo $string;
$parts = explode("_", $string);
$lastpart = (int)$parts[1];
$lastpart++;
$newstring = $parts[0] . "_" . (string)$lastpart;
echo $newstring;
This separates the string on the "_" character and converts the second part to an integer. After incrementing the integer, the string is recreated.
$new = preg_replace("/(\d+)_(\d+)/e", '"$1_" . ("$2" + 1)', $old);
The $1
etc terms are not actually variables, they are strings that preg_replace
will interpret in the replacement text. So there is no way to do this using straight text-based preg_replace
.
However, the /e
modifier on the regular expression asks preg_replace
to interpret the substitution as code, where the tokens $1
etc will actually be treated as variables. You supply the code as a string, and preg_replace
will eval()
it in the proper context, using its result as the replacement.
Here's the solution for the PHP 5.3 (now when PHP supports lambdas)
$new = preg_replace_callback("/(\d+_)(\d+)", function($matches)
{
return $matches[1] . (1 + $matches[2]);
}
, $new);