@stonewolf

Как найти именованные необязательные параметры?

Привет)

Например, есть строка вида
"ключевое_слово_1 параметр1, параметр2 ключевое_слово_2 параметр3, параметр4"

Последовательность ключевых слов может быть разная, их может быть много и они не обязательны. Параметры можно вернуть одной строкой вида "параметр1, параметр2". Ограничителей в тексте, кроме имён ключевых слов, нет.

Как исправить выражение, чтобы возвращался верный результат, а не первый match до конца строки?
Упрощённое неправильное выражение:
(?:\s*ключевое_слово_1\s(?'параметры_1'.+))?(?:\s*ключевое_слово_2\s(?'параметры_2'.+))?

Разумеется, парсер смотрит до конца, а так как второе выражение необязательное, то и выбирает всю строку. Если использовать не_жадный поиск .+? то выбирается только первый символ. Чтобы выбиралось правильно, можно конечно исключить имена ключевых слов в конце выражения поиска параметров, но если их много, то это слишком монстроузно.
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
@dodo512
$str = 'key1 p1, p2 ,p3 key2 p4,p5';
$m = preg_split('~(key1|key2)~', $str, -1, PREG_SPLIT_DELIM_CAPTURE);

for ($i = count($m) - 1; $i >= 2; $i-=2) {
    $result[$m[$i-1]] = $m[$i];
}

print_r($result);
/* Array
(
    [key1] =>  p1, p2 ,p3 
    [key2] =>  p4,p5
)
*/


Или
$str = 'key1 p1, p2 ,p3 key2 p4,p5';
preg_match_all('~(key1|key2)(.*?)(?=$|(?1))~', $str, $m);
$result = array_combine($m[1], $m[2]);
print_r($result);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы