php 组,PHP: 子组(子模式) - Manual

子组(子模式)

子组通过圆括号分隔界定,并且它们可以嵌套。

将一个模式中的一部分标记为子组(子模式)主要是来做两件事情:

将可选分支局部化。比如,模式cat(arcat|erpillar|)匹配 ”cat”, “cataract”,

“caterpillar” 中的一个,如果没有圆括号的话,它匹配的则是 ”cataract”,

“erpillar” 以及空字符串。

将子组设定为捕获子组(向上面定义的). 当整个模式匹配后,

目标字符串中匹配子组的部分将会通过 pcre_exec()() 的 ovector 参数回传给调用者。

左括号从左至右出现的次序就是对应子组的下标(从 1 开始),

可以通过这些下标数字来获取捕获子模式匹配结果。

比如,如果字符串 ”the red king” 使用模式((red|white)

(king|queen)) 进行匹配,

模式匹配到的结果是 array(“red king”, ”red king”, “red”, “king”) 的形式,

其中第 0 个元素是整个模式匹配的结果,后面的三个元素依次为三个子组匹配的结果。

它们的下表分别为 1, 2, 3。

事实上,圆括号履行的两种功能并不总是有用的。

经常我们会有一种需求需要使用子组进行分组, 但又不需要(单独的)捕获它们。

在子组定义的左括号后面紧跟字符串 ”?:” 会使得该子组不被单独捕获,

并且不会对其后子组序号的计算产生影响。比如, 如果字符串 "the white queen"

匹配模式 the ((?:red|white) (king|queen)),匹配到的子串是 "white queen" 和 "queen",

他们的下标分别是 1 和 2。捕获子组的最大序号为 65535。然而,有可能我们并不能编译这么长的

正则表达式,这取决于 libpcre 的配置。

为了方便简写,如果需要在非捕获子组开始位置设置选项,

选项字母可以位于 ? 和 : 之间,比如:

(?i:saturday|sunday)

(?:(?i)saturday|sunday)

上面两种写法实际上是相同的模式。因为可选分支会从左到右尝试每个分支,

并且选项没有在子模式结束前被重置,

并且由于选项的设置会穿透对后面的其他分支产生影响,因此,

上面的模式都会匹配 ”SUNDAY” 以及 ”Saturday”。

在 PHP 4.3.3 中,可以对子组使用 (?Ppattern) 的语法进行命名。

这个子模式将会在匹配结果中同时以其名称和顺序(数字下标)出现, PHP

5.2.2中又增加了两种味子组命名的语法:

(?pattern) 和 (?’name’pattern)。

有时需要多个匹配可以在一个正则表达式中选用子组。

为了让多个子组可以共用一个后向引用数字的问题,

(?| 语法允许复制数字。

考虑下面的正则表达式匹配Sunday:

(?:(Sat)ur|(Sun))day

这里当后向引用 1 空时Sun 存储在后向引用 2 中.

当后向引用 2 不存在的时候 Sat 存储在后向引用 1中。 使用

(?|修改模式来修复这个问题:

(?|(Sat)ur|(Sun))day

使用这个模式,

Sun和Sat都会被存储到后向引用1中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值