浅谈PHP正则中的捕获组与非捕获组


Posted in PHP onJuly 18, 2016

今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中出现的问题。

什么是捕获组

我们先看一下PHP的正则匹配函数

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

前面两项是我们常用的,$pattern是正则匹配模式,$string是要匹配的字符串。

array &$match,它是一个数组,&表示匹配出来的结果会被写入$match中。

int $flags 如果传递了这个标记, 对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。

int $offset 用于指定从目标字符串的某个未知开始搜索(单位是字节)。

我们主要看一下$match的值里会有什么:

$mode = '/a=(\d+)b=(\d+)c=(\d+)/';

$str='**a=4b=98c=56**';

$res=preg_match($mode,$str,$match);

var_dump($match);

结果如下:

array (size=4)
=> string 'a=4b=98c=56' (length=11)
=> string '4' (length=1)
=> string '98' (length=2)
=> string '56' (length=2)

现在我们知道了什么是捕获组,捕获组是正则表达示中以()括起来的部分,每一对()是一个捕获组。

PHP会为它编号,从1开始。至于为什么会从1开始,那是因为PHP把匹配到的完整字符串编号为0。

如果有多个括号或嵌套括号,按左边括号出现的顺序来进行编号,如图:

浅谈PHP正则中的捕获组与非捕获组

按图中的匹配模式匹配时,捕获组的123号分别是红绿蓝。

捕获组的忽略与命名

我们还可以阻止PHP为匹配组的编号:在匹配组中模式前加  ?:

$mode = '/a=(\d+)b=(?:\d+)c=(\d+)/';

这样,匹配结果就会变成:

array (size=3)
=> string 'a=4b=98c=56' (length=11)
=> string '4' (length=1)
=> string '56' (length=2)

当然,我们也可以在括号的内部为它给它独特的名字。

命名子组可以接受(?<name>), (?'name') 以及(?P<name>)语法. 之前版本仅接受(?P<name>)语法.

例如:$mode = '/a=(\d+)b=(?P<sec>\d+)c=(\d+)/';

使用时结果为:

array (size=5)
=> string 'a=4b=98c=56' (length=11)
=> string '4' (length=1)

 'sec' => string '98' (length=2)
=> string '98' (length=2)
=> string '56' (length=2)

在保留索引数组的同时,加上一个关联项,key值为捕获组名。

捕获组的反向引用

我们在用preg_replace()函数进行正则替换时,我们还可以使用 \n 或 $n 来引用第n个捕获组.

$mode = '/a=(\d+)b=(\d+)c=(\d+)/';

$str='**a=4b=98c=56**';

$rp='\1/$2/\3/';

echo preg_replace($mode,$rp,$str);//**4/98/56/**

\1表示捕获组1(4),$2为捕获组2(98),\3为捕获组3(56)。

非捕获组的用法:

为什么称为非捕获组呢?那是因为它们有捕获组的特性,在匹配模式的()中,但是匹配时,PHP不会为它们编组,它们只会影响匹配结果,并不作为结果输出。

/d(?=xxx)    匹配"后面是xxx的一个数字"。

注意格式:只能放在匹配模式字符串之后

例如:

$pattern='/\d(?=abc)/';

$str="ab36abc8eg";

$res=preg_match($pattern,$str,$match);

var_dump($match);//6

匹配的6,因为只有它作为一个数字,后面还有abc。

(?<=xxx) /d 匹配"前面是xxx的一个数字"

注意格式:只能放在匹配模式字符串之前

例如:

$pattern='/(?<=abc)\d/';

$str="ab36abc8eg";

$res=preg_match($pattern,$str,$match);

var_dump($match);//8

匹配的8,因为只有它作为一个数字,后面还有abc。

与(?=xxx)  (?<=xxx)相对的是(?!=xxx)  (?<!=xxx) 它们在=前加了非运算符 “!”

它表示前面/后面不是xxx的字符串,这里就不再举例了。

以上这篇浅谈PHP正则中的捕获组与非捕获组就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
转换中文日期的PHP程序
Oct 09 PHP
php处理restful请求的路由类分享
Feb 27 PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 PHP
PHP加密解密类实例代码
Jul 20 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
PHP后期静态绑定实例浅析
Dec 21 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
Yii2.0表关联查询实例分析
Jul 18 #PHP
php 实现301重定向跳转实例代码
Jul 18 #PHP
PHP的openssl加密扩展使用小结(推荐)
Jul 18 #PHP
PHP多进程编程总结(推荐)
Jul 18 #PHP
php 指定范围内多个随机数代码实例
Jul 18 #PHP
php 解决substr()截取中文字符乱码问题
Jul 18 #PHP
Yii2中cookie用法示例分析
Jul 18 #PHP
You might like
PHP中动态HTML的输出技术
2006/10/09 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
php正则表达式使用的详细介绍
2013/04/27 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
php析构函数的简单使用说明
2015/08/24 PHP
php实现点击可刷新验证码
2015/11/07 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
python如何为创建大量实例节省内存
2018/03/20 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
理货员的岗位职责
2013/11/23 职场文书
医学专业毕业生个人的求职信
2013/12/04 职场文书
房地产融资计划书
2014/01/10 职场文书
公司请假条范文
2014/04/11 职场文书
职务说明书范文
2014/05/07 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
妇女干部培训方案
2014/05/12 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB