PHP正则表达式之捕获组详解

3条评论

2012 年 04 月 16 日 at 上午 10:18分类:PHP

已命名捕获组(Named Groups)
当在一个表达式内多次用到回调引用时,很容易就把事情搞混淆,要弄清那些数字(1 … 9)都代表哪一个子内容是件很麻烦的事。回调引用的一个替代方法是使用带名字的捕获组(下文简称“有名组”)。有名组使用(?Ppattern)来设定,name代表组名,pattern是配合该有名组的正则结构。请看下面的例子:

/^(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})/

上式中,year/month/day就是组名,组名后面的是改组匹配内容的正则。这个式子的效果和上面的回调引用实例一样,只不过是用了有名组来实现。是不是更加易读易懂了?

有名组也能用于处理已匹配内容之数组的内部数据。赋予特定正则的组名(quote)也能作为所匹配到的内容在数组内部的索引词。

<?php

preg_match( '/^(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})/', "2012-21-12", $matches );

var_dump($matches);

?>

输出的结果是:

array
  0 => string '2012-21-12' (length=10)
  'year' => string '2012' (length=4)
  1 => string '2012' (length=4)
  'month' => string '21' (length=2)
  2 => string '21' (length=2)
  'day' => string '12' (length=2)
  3 => string '12' (length=2)

如果不用有名组的话,那么我们匹配出来的结果并没有相应的指定的key而是全是数字形式的key,这样子不方便我们在开发中
使用相关的参数,使用有名组的话,这个问题就很好解决了!
所以,有名组并不只是让写代码更容易,它也能用于组织代码。