我正在尝试使用PHP PCRE中的命名子模式/'子程序'正则表达式功能,希望有人可以解释以下奇怪的输出:
我不明白为什么命名组"a"的内容没有出现在结果中。将
我真的很喜欢用这种方式编写正则表达式,因为你可以使它们非常强大,同时保持可维护性(请参见此答案,其中有一个很好的例子),但是如果匹配数据中没有子模式,则实际上没有什么用处。
我是否遗漏了什么或者我应该只是悲叹可能已经失去的东西并继续前进?
$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"的内容没有出现在结果中。将
preg_match
更改为preg_match_all
可以将"a"和"1"放入匹配数据中,但两者都只包含空字符串。我真的很喜欢用这种方式编写正则表达式,因为你可以使它们非常强大,同时保持可维护性(请参见此答案,其中有一个很好的例子),但是如果匹配数据中没有子模式,则实际上没有什么用处。
我是否遗漏了什么或者我应该只是悲叹可能已经失去的东西并继续前进?
(?(DEFINE)…)
的工作原理。它类似于声明子程序。我有时会在定义之外使用全大写的命名捕获组,并在其中使用小写的可调用非捕获组,以帮助我区分两者。请查看此答案中给出的较长解决方案,了解我如何同时使用命名组进行调用和捕获。我从%+
哈希表中提取捕获的内容,例如$+{VALUE}
或@+{ qw< TAG BODY > }
。 - tchrist