我正在试验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?
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么命名组"a"不在结果中(内容为"a").更改preg_match为preg_match_all在匹配数据中放置"a"和"1",但两者仅包含空字符串.
我非常喜欢用这种方式编写正则表达式的想法,因为你可以使它们非常强大,同时保持它们非常易于维护(请参阅这个答案以获得一个很好的例子),但是如果子模式在匹配数据中不可用那么它不是真的很有用.
我在这里遗漏了什么,或者我应该哀悼可能发生的事情并继续前进?