Задача достаточно ясна. На входе у нас переменный шаблон регулярного выражения, который якобы содержит именованные подшаблоны, а на выходе нам нужно получить массив имен подшаблонов:
function get_subpattern_names($any_input_pattern) {
// What pattern to use here?
$pattern_to_get_names = '/.../';
preg_match_all($pattern_to_get_names, $any_input_pattern, $matches);
return $matches;
}
Итак, вопрос в том, что использовать в качестве $pattern_to_get_names
в приведенной выше функции?
Например:
get_subpattern_names('/(?P<name>\w+): (?P<digit>\d+)/');
должен вернуться:
array('name', 'digit');
P.S.: Согласно документации PCRE, имена подшаблонов состоят из 32 буквенно-цифровых символов. символов и подчеркивания.
Поскольку мы не контролируем шаблон ввода, нам нужно учитывать все возможные варианты синтаксиса именования. Согласно документации PHP, это:(?P<name>pattern)
, (?<name>pattern)
и (?'name'pattern)
.
Нам также необходимо учитывать вложенные подшаблоны, например:(?<name1>.*(?<name2>pattern).*)
.
Нет необходимости подсчитывать повторяющиеся имена, чтобы сохранить порядок появления или получить числовые, незахватывающие или другие типы подшаблонов. Просто список имен, если они есть.