Я экспериментирую с именованными функциями регулярного выражения subpattern / 'subroutine' в PHP PCRE, и я надеюсь, что кто-то может объяснить следующий странный вывод:
$re = "/
(?(DEFINE)
(?<a> a )
)
^(?&a)$
/x";
var_dump(preg_match($re, 'a', $match)); // (int) 1 as expected
var_dump($match); // Array( [0] => 'a' ) <-- Why?
Я не могу понять, почему именованная группа "a" не находится в результате (с содержанием "a"). Изменение preg_match
на preg_match_all
помещает "a" и "1" в данные о совпадении, но оба содержат только пустую строку.
Мне действительно нравится идея написания регулярных выражений таким образом, поскольку вы можете сделать их невероятно мощными, в то же время сохраняя их очень легко обслуживаемыми (см. этот ответ для хорошего примера этого), однако, если подшаблоны недоступно в данных о матче, тогда это не особо полезно.
Я что-то здесь упускаю или я должен просто оплакивать то, что могло бы быть, и двигаться дальше?