我與命名的子模式試驗/ PHP中的PCRE「子程序」正則表達式的功能,我希望有人能解釋一下下面的怪輸出: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
放「一」和「1」,但都僅包含一個空字符串。
我真的很喜歡用這種方式編寫正則表達式的想法,因爲您可以使它們非常強大,同時保持它們的可維護性(請參閱this answer就是一個很好的例子),但是如果子模式在匹配數據中不可用那真的沒太大用處。
我失去了一些東西在這裏,或者我應該只是悼念什麼,本來,繼續前進?
是的,這是正確的;這是'(?(DEFINE)...)'的作用。它想要聲明子例程。我有時會在定義之外使用全部大寫命名捕獲組,並將小寫字母用於其內部的可召集的非捕獲組,以幫助將兩者保持在我的頭腦中。看看給出的解決方案的更長時間[在這個答案](http://stackoverflow.com/questions/4284176/doubt-in-parsing-data-in-perl-where-am-i-going-wrong/4286326# 4286326)我如何在兩種方式中使用命名組:調用和捕獲。我從`%+`哈希中抽取的那些哈希,例如`$ + {VALUE}`或`@+{qw}`。 –
tchrist
2011-02-09 11:32:58