Как заменить прег именованную группу значениями из массива соответствующими ключами? - PullRequest
0 голосов
/ 09 января 2020

У меня есть несколько шаблонов preg для анализа данных. Но сейчас мне нужно заняться обратной задачей. Подставьте мои данные в существующие шаблоны preg. Например, строковые шаблоны:

something(?<value>\d+)something
another(?P<id>\d+)another
someone(?'number'\d+)someone

И пример массива:

[
'value' => 'something',
'id' => '123',
'number' => '828',
];

Пример результата:

somethingsomethingsomething
another123another
someone828someone

Есть идеи?

1 Ответ

1 голос
/ 10 января 2020

Если вы хотите динамическую замену c, вы можете использовать шаблон с 2 группами захвата. В первой группе вы фиксируете то, что хотите сохранить в замене.

Значение второй группы захвата можно использовать в качестве ключа для индексации в массиве примеров.

Вы можете использовать и preg_match_callback для возврата строки замены.

Если текст до и после этой группы захвата должен быть одинаковым, вы можете использовать обратную ссылку \1

([^(\r\n]+)\(\?(?|P?<([^>]+)>|'([^']+)')[^)\r\n]+\)\1

О шаблоне

  • ([^(\r\n]+) Захват группа 1 Совпадение 1+ раз с любым символом, кроме ( или новой строкой
  • \(\? Совпадение (?
  • (?| Группа сброса ветви, это будет группа 2
    • P?<([^>]+)> Соответствует необязательному P и захватывает в группе то, что находится между < и >
    • | Или
    • '([^']+)' Захват в группе между '
  • ) Закрытие группы сброса ветви
  • [^)\r\n]+\) Матч 1 + раз любой символ, кроме ) или новой строки, затем сопоставьте )
  • \1 обратную ссылку на группу 1

regex demo | Php демо

Например

$exampleArray = [
    'value' => 'something',
    'id' => '123',
    'number' => '828',
];

$re = '/([^(\r\n]+)\(\?(?|P?<([^>]+)>|\'([^\']+)\')[^)\r\n]+\)\1/';
$str = <<<STR
something(?<value>\d+)something
another(?P<id>\d+)another
someone(?'number'\d+)someone
STR;

$result =preg_replace_callback($re, function($m) use ($exampleArray) {
    return $m[1] . $exampleArray[$m[2]] . $m[1];
}, $str);

echo $result;

Выход

somethingsomethingsomething
another123another
someone828someone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...