PHP REGEX: как дополнить числа в середине / конце строки - PullRequest
1 голос
/ 04 марта 2020

У меня есть список пар ключ => значение из JSON squirt. Я отсортировал массив, и у меня осталось следующее (отрывки соответствующих случаев, потому что они go выше 92):

dir1summary
dir10summary
dir1summarydue
dir10summarydue
directive1
directive10
directivecode1
directivecode10

что мне нужно сделать, это: 1) поместить все цифры в конец и 2) дополняют их до 2 цифр (01,02, & c), поэтому список в итоге выглядит так:

directivesummary01
directivesummary10
directivesummarydue01
directivesummarydue10
directive01
directive10
directivecode01
directivecode10

Я надеялся сделать это с помощью одного оператора REGEX, учитывая очевидное сходство ключевых имен, но я заблудился. вот что у меня есть:

dir((\d{1,2}(summary|summarydue))|((ective\d{1,2})|(ectivecode\d{1,2})))

... ааа, и я потерян, что делать дальше. как двигаться дальше? Есть ли лучший компактный способ сделать это?

РЕДАКТИРОВАТЬ: это также означает, что я должен заменить «dir» на «директиву». это подразумевается в списке результатов, но я не сделал элемент для него. Кроме того, REGEX - это все, что я смог построить на RegExer . таким образом, часть «потерялось, что делать дальше».

1 Ответ

2 голосов
/ 04 марта 2020
  • Совпадение, но не захватывает dir
  • Совпадение, но не захватывает дополнительную подстроку ective
  • Сохраняет ноль или более нецифровых символов сразу после ective как группа захвата # 1 (это учитывает необязательные подстроки, такие как summarydue)
  • Сохраняет все целое число как группа захвата # 2
  • Сохраняет оставшуюся часть строки как захват группа # 3


  • В пользовательской функции жестко кодируйте directive, затем добавьте группу захвата № 1 (которая может быть пустой), затем группу захвата № 3 (также может быть пусто), наконец, левая группа захвата пэда # 2 с нулем до максимальной длины из 2 цифр и добавление этого значения к концу строки

Код: ( Демо )

$strings = [
    'dir1summary',
    'dir10summary',
    'dir1summarydue',
    'dir10summarydue',
    'directive1',
    'directive10',
    'directivecode1',
    'directivecode10',
];

var_export(
    preg_replace_callback(
        '/dir(?:ective)?(\D*)(\d+)(.*)/',
        function ($m) {
            return "directive{$m[1]}{$m[3]}" . str_pad($m[2], 2, "0", STR_PAD_LEFT);
        },
        $strings
    )
);

Вывод:

array (
  0 => 'directivesummary01',
  1 => 'directivesummary10',
  2 => 'directivesummarydue01',
  3 => 'directivesummarydue10',
  4 => 'directive01',
  5 => 'directive10',
  6 => 'directivecode01',
  7 => 'directivecode10',
)
...