浅谈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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
利用PHP和AJAX创建RSS聚合器的代码
Mar 13 PHP
php出现Cannot modify header information问题的解决方法大全
Apr 09 PHP
TMDPHP 模板引擎使用教程
Mar 13 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
php笔记之:AOP的应用
Apr 24 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 PHP
PHP学习笔记之session
May 06 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
Jul 17 PHP
Laravel如何实现自动加载类
Oct 14 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 身份证号验证函数
2009/05/07 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
动态添加js事件实现代码
2009/03/12 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
python dict remove数组删除(del,pop)
2013/03/24 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python中pillow知识点学习
2018/04/30 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
python实现批处理文件
2020/07/28 Python
python 实现单例模式的5种方法
2020/09/23 Python
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
领导视察欢迎词
2014/01/15 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
《乞巧》教学反思
2014/02/27 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
天河观后感
2015/06/11 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python