正则固化分组(?>...)
之前在 正则表达式30分钟入门教程 中了解过 (?:...)、(?=...)、 (?<=...)、 (?!)、(?<!...),
1、(?:) 分组单不捕获
2、(?=) 顺序环视(从左到右) 例如: (?=\d) 检查当前位置的右侧是否匹配数字
3、(?<=) 逆序环视(从右到左) 例如: (?<=\d) 检查当前位置的左侧是否匹配数字
【注】:环视不会”占用“字符
例如:字符串 "abcdef"
/(?=abc)abc/和/abc(?=def)/ 匹配结果是一样的
但是里面并没有详细介绍(?>...),以下就来介绍这个奇怪的表达式
摘自《精通正则表达式》P139
固化分组:(?>...)
「.*」在固化分组中,永远不会"交还"已经匹配的任何内容。固化分组还有一个重要的用途,尤其是能提高匹配的效率
例:
preg_match('/.*[0-9]/', 'abcdef9', $m); var_dump($m); preg_match('/(?>.*)[0-9]/', 'abcdef9', $m); var_dump($m); /** * array (size=1) 0 => string 'abcdef9' (length=7) array (size=0) empty */
第二个使用了固化分组,「.*」可以匹配整行记录,不会"交还"最后的数字,[0-9]得不到匹配所以匹配失败
第一个虽然也使用了「.*」,「.*」也可以匹配整行记录,但为了整个表达式的匹配,「.*」会"交还"最后的数字9,
如果要深入了解固化分组可以查看《精通正则表达式》一书的P171 和 P269