开发者

How can I find, increment and replace in php?

开发者 https://www.devze.com 2023-01-25 20:43 出处:网络
I have strings in the form \\d+_开发者_如何学C\\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:

I have strings in the form \d+_开发者_如何学C\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:

  • 1234567_2 should become 1234567_3
  • 1234_10 should become 1234_11

Here is my first attempt:

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)$2)+1, $old);

This results in a syntax error:

Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in [...] on line 201

Here is my second attempt

$new = preg_replace("/(\d+)_(\d+)/", "$1_".("$2"+1), $old);

This transforms $old = 1234567_2 into $new = 1234567_1, which is not the desired effect

My third attempt

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)"$2"+1), $old);

This yeilds the same result.

By making these attempts, I realized I didn't understand how the new $1, $2, $3, .. variables really worked, and so I don't really know what else to try because it seems that these variables no longer exist upon exiting the preg_replace function...

Any ideas?


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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消