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 相关文章推荐
PHP中cookies使用指南
Mar 16 PHP
Mysql和网页显示乱码解决方法集锦
Mar 27 PHP
PHP加速 eAccelerator配置和使用指南
Jun 05 PHP
php设计模式 Observer(观察者模式)
Jun 26 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
php二维数组用键名分组相加实例函数
Nov 06 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
PHP手机短信验证码实现流程详解
May 17 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网站基础优化方法小结
2008/09/29 PHP
在项目中寻找代码的坏命名
2012/07/14 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
php 类自动载入的方法
2015/06/03 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
python友情链接检查方法
2015/07/08 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
对Python中plt的画图函数详解
2018/11/07 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
仓库管理专业个人自我评价范文
2013/11/11 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
感恩教育观后感
2015/06/17 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
Selenium浏览器自动化如何上传文件
2022/04/06 Python