Как я могу найти, увеличить и заменить в php? - PullRequest
2 голосов
/ 18 ноября 2010

У меня есть строки в форме \d+_\d+, и я хочу добавить 1 ко второму числу. Поскольку мое объяснение очень ясное, приведу несколько примеров:

  • 1234567_2 должно стать 1234567_3
  • 1234_10 должно стать 1234_11

Вот моя первая попытка:

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

Это приводит к синтаксической ошибке:

Ошибка разбора: синтаксическая ошибка, неожиданная T_LNUMBER, ожидая T_VARIABLE или '$' в [...] строке 201

Вот моя вторая попытка

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

Это преобразует $ old = 1234567_2 в $ new = 1234567_1, что не является желаемым эффектом

Моя третья попытка

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

Это дает тот же результат.

Сделав эти попытки, я понял, что не понимаю, как новые переменные $ 1, $ 2, $ 3, .. действительно работают, и поэтому я не знаю, что еще попробовать, потому что кажется, что эти переменные больше не работают существует при выходе из функции preg_replace ...

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 18 ноября 2010
$new = preg_replace("/(\d+)_(\d+)/e", '"$1_" . ("$2" + 1)', $old);

Термины $1 и т. Д. На самом деле не являются переменными, это строки, которые preg_replace будет интерпретировать в тексте замены. Таким образом, нет никакого способа сделать это, используя простой текстовый preg_replace.

Однако модификатор /e в регулярном выражении просит preg_replace интерпретировать подстановку как код , где токены $1 и т. Д. Фактически будут обрабатываться как переменные. Вы предоставляете код в виде строки, и preg_replace будет eval() в правильном контексте, используя его результат в качестве замены.

3 голосов
/ 12 августа 2013

Вот решение для PHP 5.3 (теперь, когда PHP поддерживает лямбды)

$new = preg_replace_callback("/(\d+_)(\d+)", function($matches)
{
    return $matches[1] . (1 + $matches[2]);
}
, $new);
0 голосов
/ 18 ноября 2010

Использовать explode (пошагово):

$string = "123456_2";

echo $string;

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

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

$lastpart++;

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

echo $newstring;

. Разделяет строку на символ "_" и преобразует вторую часть в целое число.После увеличения целого числа строка воссоздается.

...