PHP正则之正向预查与反向预查讲解与实例


Posted in PHP onApril 06, 2020

了解正向预查&反向预查前,我们先要知道正则的2个函数:preg_match_all 、 preg_replace

正向预查&反向预查

正向或反向预查都是非获取匹配,不进行存储供以后使用。

1、正向预查

(?:pattern) 匹配结果

(?=pattern) 正向匹配

(?!pattern) 正向不匹配

2、反向预查

(?<=pattern) 反向匹配。

(?<!pattern) 反向不匹配。

什么叫非获取匹配(非捕获匹配),请看例子

一:PHP正则正向预查实例

PHP获取匹配实例

$str = 'XXXXjava6java7XXXX';
$perg = "/java(6|7)/"; //匹配java6 获取 java

preg_match_all($perg, $str, $matchs);
$str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"
$str2 = preg_replace($perg, '\1', $str); //"XXXX67XXXX"

$matchs输出结果:

array(2) {
 [0]=>
 array(2) {
  [0]=>
  string(5) "java6"
  [1]=>
  string(5) "java7"
 }
 [1]=>
 array(2) {
  [0]=>
  string(1) "6"
  [1]=>
  string(1) "7"
 }
}

$str1输出结果:

string(18) "XXXXjava6java7XXXX"

$str2输出结果:

string(10) "XXXX67XXXX"

知道了preg_match_all的用法,对于上面的输出结果应该很清楚,[n]的后向引用。 [0]中保存的是匹配结果的全文,数组的个数=匹配到结果的个数,[1] 中保存的匹配结果中对应括号中匹配的结果(子组),.....[n]第n个括号中的匹配内容。

preg_replace 中的 \0,\1,也是对匹配结果的引用。

$str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX", 用全文中的匹配结果进行对应替换

$str2 = preg_replace($perg, '\1', $str); //"XXXX67XXXX",用括号中的子结果进行对应的替换

我们对比知道,\0 的替换内容,是匹配全文的中内容,对应元素的替换。

PHP匹配结果实例

$str = 'XXXXjava6java7XXXX';
$perg = "/java(?:6|7)/"; 
 
preg_match_all($perg, $str, $matchs);
$str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"

$match 输出结果:

array(1) {
 [0]=>
 array(2) {
  [0]=>
  string(5) "java6"
  [1]=>
  string(5) "java7"
 }
}

$str1输出结果:

string(18) "XXXXjava6java7XXXX"

对比例1中,我们发现没有括号匹配的结果,这就是我们说的非获取匹配,只匹配全本结果,不捕获括号中的子结果。

php正向匹配实例

$str = 'XXXXjava6java7XXXX';
$perg = "/java(?=6|7)/";

preg_match_all($perg, $str, $matchs);
$str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"
var_dump($matchs, $str1);
die;

输出结果:

array(1) {
 [0]=>
 array(2) {
  [0]=>
  string(4) "java"
  [1]=>
  string(4) "java"
 }
}
string(18) "XXXXjava6java7XXXX"

相比上面的我们匹配的结果中没有 6,7

PHP正向不匹配实例

$str = 'XXXXjava6java7XXXX';
$perg = "/java(?!6)/"; //不匹配java6

preg_match_all($perg, $str, $matchs);
$str1 = preg_replace($perg, '', $str); //"XXXXjava67XXXX"
var_dump($matchs, $str1);
die;

输出结果:

array(1) {
 [0]=>
 array(1) {
  [0]=>
  string(4) "java"
 }
}
string(14) "XXXXjava67XXXX"

这里匹配的到结果是java7,但是由于我们用了非获取匹配,就不存贮7,剩下的就是java了

主要:不管是怎么替换,如果我们只要用的是 \0(完整匹配结果) 中的结果进行替换,相当于匹配到了什么就替换掉原字符串中的什么,实际上原字符串没变化,

二 . 反向预查

(?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java

(?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java

PHP反向预查实例

$str = 'XXXXjava6java7XXXX';
$perg = "/(?<!6)java/"; //不匹配前端有6的java

preg_match_all($perg, $str, $matchs);
$str1 = preg_replace($perg, '', $str); //"XXXX6java7XXXX"
var_dump($matchs, $str1);
die;

输出结果:

array(1) {
 [0]=>
 array(1) {
  [0]=>
  string(4) "java"
 }
}
string(14) "XXXX6java7XXXX"

总结:

正向预查,反向预查,就是方向不同。
正向预查时,具体字符串在左边,/java(?:6|7)/,从字符串开始向右查找;
反向则在右边: / (?<!J)a /,从字符串向反方向(左)查找。

更多关于PHP正则使用技巧请查看下面的相关链接

PHP 相关文章推荐
关于BIG5-HKSCS的解决方法
Mar 20 PHP
PHP 实例化类的一点摘记
Mar 23 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
php以post形式发送xml的方法
Nov 04 PHP
给ECShop添加最新评论
Jan 07 PHP
分享php多功能图片处理类
May 15 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
PHP命名空间简单用法示例
Dec 28 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
laravel 多图上传及图片的存储例子
Oct 14 PHP
TP5框架安全机制实例分析
Apr 05 #PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 #PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 #PHP
TP5框架实现签到功能的方法分析
Apr 05 #PHP
TP5框架页面跳转样式操作示例
Apr 05 #PHP
TP5框架实现的数据库备份功能示例
Apr 05 #PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 #PHP
You might like
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
将python图片转为二进制文本的实例
2019/01/24 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
python二维图制作的实例代码
2020/12/03 Python
python os.listdir()乱码解决方案
2021/01/31 Python
医院门卫岗位职责
2013/12/30 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
教师档案管理制度
2014/01/23 职场文书
简历的自我评价范文
2014/02/04 职场文书
健康状况证明模板
2014/10/23 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
护士节慰问信
2015/02/15 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书