【发布时间】:2011-06-23 21:33:49
【问题描述】:
我正在尝试 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”放入匹配数据中,但都只包含一个空字符串。
我真的很喜欢以这种方式编写正则表达式的想法,因为您可以使它们非常强大,同时保持它们非常易于维护(请参阅this answer 以获得一个很好的例子),但是如果子模式在匹配中不可用数据那么它真的没有多大用处。
我是在这里遗漏了什么,还是应该哀悼可能发生的事情并继续前进?
【问题讨论】: