2

フォームに文字列があり\d+_\d+、2 番目の数値に 1 を追加したいと考えています。私の説明は非常に明確なので、いくつかの例を挙げましょう。

  • 1234567_2 は 1234567_3 になるはずです
  • 1234_10 は 1234_11 になるはずです

これが私の最初の試みです:

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

これにより、構文エラーが発生します。

解析エラー: 構文エラー、予期しない T_LNUMBER、201 行目の [...] に T_VARIABLE または '$' が必要です

これが私の2回目の試みです

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

これは $old = 1234567_2 を $new = 1234567_1 に変換しますが、これは望ましい結果ではありません

私の3回目の試み

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

これは同じ結果になります。

これらの試行を行うことで、新しい $1、$2、$3、.. 変数が実際にどのように機能するかを理解していないことに気付きました。終了時にこれらの変数が存在しなくなっているように見えるため、他に何を試せばよいかわかりません。 preg_replace 関数...

何か案は?

4

3 に答える 3

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

$1etc 用語は実際には変数ではなく、置換テキストで解釈される文字列ですpreg_replace。そのため、そのままのテキストベースを使用してこれを行う方法はありませんpreg_replace

ただし、/e正規表現の修飾子は、置換を code としてpreg_replace解釈するように要求し、トークンなどは実際には変数として扱われます。コードを文字列として提供し、その結果を置換として使用して、適切なコンテキストでそれを行います。$1preg_replaceeval()

于 2010-11-17T22:53:10.450 に答える
3

PHP 5.3のソリューションは次のとおりです(PHPがラムダをサポートするようになりました)

$new = preg_replace_callback("/(\d+_)(\d+)", function($matches)
{
    return $matches[1] . (1 + $matches[2]);
}
, $new);
于 2013-08-12T10:40:58.723 に答える
0

使用explode(ステップバイステップ):

$string = "123456_2";

echo $string;

$parts = explode("_", $string);

$lastpart = (int)$parts[1];

$lastpart++;

$newstring = $parts[0] . "_" . (string)$lastpart;

echo $newstring;

これにより、文字列が「_」文字で区切られ、2 番目の部分が整数に変換されます。整数をインクリメントした後、文字列が再作成されます。

于 2010-11-17T22:54:24.757 に答える