【发布时间】:2014-07-17 02:23:17
【问题描述】:
我注意到 PCRE 正则表达式的一些奇怪行为,我无法解释。我希望代码:
preg_match('!^.+?(?:/programs/([^?#]+))?.*?$!',
'http://example.com/programs/drive', $matches);
返回“驱动器”作为匹配1。非捕获组之后的[^?#]+和?都是贪婪的,那么为什么[^?#]+不优先匹配drive?相反,测试显示开头的.+? 与h 匹配,而结尾的.*? 与URL 的其余部分匹配。
相比之下,代码:
preg_match('!^.+?(?:/programs/([^?#]+).*)?$!',
'http://example.com/programs/drive', $matches);
按预期工作并返回 drive 作为匹配 1。
【问题讨论】:
-
@hwnd 我假设只匹配没有查询字符串或哈希的 URL,或者只匹配这些字符之前的组件。
-
@hwnd:不,它尽可能匹配零次或一次。这是贪婪的。
标签: php regex regex-greedy