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生成缩略图的类代码
Oct 02 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
php 判断网页是否是utf8编码的方法
Jun 06 PHP
PHP获取数组中重复最多的元素的实现方法
Nov 11 PHP
php实现的操作excel类详解
Jan 15 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
php ajax confirm 删除实例详解
Mar 06 PHP
Referer原理与图片防盗链实现方法详解
Jul 03 PHP
Laravel5.5 动态切换多语言的操作方式
Oct 25 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
Apr 27 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
用header 发送cookie的php代码
2007/03/16 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
PHP Reflection API详解
2015/05/12 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
在Windows8上的搭建Python和Django环境
2014/07/03 Python
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
python计算导数并绘图的实例
2020/02/29 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
考博专家推荐信模板
2013/12/02 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
校园安全演讲稿
2014/05/09 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
2016年母亲节寄语
2015/12/04 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL