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+MYSQL 出现乱码的解决方法
Aug 08 PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
php后门URL的防范
Nov 12 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
Mar 05 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
Aug 06 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之第六天
2006/10/09 PHP
php 定界符格式引起的错误
2011/05/24 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
php生成二维码
2015/08/10 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
JS百度地图搜索悬浮窗功能
2017/01/12 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
Python在线运行代码助手
2016/07/15 Python
对python中的logger模块全面讲解
2018/04/28 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
详解python中init方法和随机数方法
2019/03/13 Python
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
师范生实习个人的自我评价
2013/09/28 职场文书
岗位职责定义及内容
2013/11/08 职场文书
演讲稿开场白
2014/01/13 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
安全生产责任书
2014/03/12 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
Mysql Show Profile
2021/04/05 MySQL