PHP: Каков шаблон для поиска подстрок с пунктирными числами и замены после модификации? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть строки с цифрами-тире подстрок. Я хочу найти эти подстроки и заменить их после некоторых изменений.

Например, строка выглядит так:

  • Это номер строки 123 -45-6789-0 , который содержит 12-34567 .

Теперь я хочу найти подстроки чисел-тире ( 123 -45-6789-0 и 12-34567 ) и заменить их на модифицированные подстроки. Например, последняя строка будет выглядеть следующим образом:

  • Это измененная строка 0-6789-45-123 , которая содержит 34567-12 .

Я уже пробовал preg_match_all(string $pattern, string $subject, array &$matches) с:

  • $pattern = '/-*\d+-*/';

, но это дает мне массив чисел, каждый из которых имеет значение da sh, например:

  • $matches = [123-, 45-, 6789-, 0, 12-, 34567]

, тогда как я хочу получить массив из двух подстрок, например :

  • $matches = [0 => 123-45-6789-0, 1 => 12-34567]

для выполнения модификаций и замен (с использованием str_replace()), отдельно.

Какой шаблон и методы следует использовать использовать для этих целей?

Заранее спасибо.

1 Ответ

1 голос
/ 26 апреля 2020

Вы можете использовать \d+(?:-\d+)+ regex с функцией preg_replace_callback`:

$str = 'This is the string number 123-45-6789-0 which contains 12-34567.';
echo preg_replace_callback('~\d+(?:-\d+)+~', function($m) { 
    return implode('-', array_reverse(explode('-', $m[0]))); }
,$str);
// => This is the string number 0-6789-45-123 which contains 34567-12.

См. PHP demo и regex demo .

Шаблон \d+(?:-\d+)+ соответствует

  • \d+ - 1+ цифр
  • (?:-\d+)+ - 1 или более вхождений последовательностей - и 1+ цифр.

$m - массив совпадений, $m[0] содержит значение совпадения. При explode строка разделяется на -, затем массив переворачивается и затем соединяется с implode.

...