Регулярные выражения PCRE с использованием подпрограмм именованных шаблонов

Я экспериментирую с функциями регулярного выражения с именем subpattern / 'subroutine' в PHP PCRE и надеюсь, что кто-нибудь сможет объяснить следующий странный результат:

$re = "/
(?(DEFINE)
    (? 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" в данные соответствия, но оба содержат только пустая строка.

Мне очень нравится идея написания регулярных выражений таким образом, так как вы можете сделать их невероятно мощными, сохраняя при этом удобство обслуживания (см. этот ответ для хорошего примера), однако, если подшаблоны недоступны в данных сопоставления, то на самом деле от этого мало пользы.

Мне что-то здесь не хватает, или мне просто оплакивать то, что могло быть, и двигаться дальше?

5
задан Community 23 May 2017 в 12:29
поделиться