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 引用是个坏习惯
Mar 12 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
PHP的构造方法,析构方法和this关键字详细介绍
Oct 22 PHP
destoon常用的安全设置概述
Jun 21 PHP
php实现微信公众号无限群发
Oct 11 PHP
php实现Mysql简易操作类
Oct 11 PHP
PHP引用的调用方法分析
Apr 25 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
thinkphp框架类库扩展操作示例
Nov 26 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
SONY SRF-M100的电路分析
2021/03/02 无线电
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
Django csrf 验证问题的实现
2018/10/09 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
python实现PCA降维的示例详解
2020/02/24 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
2014学雷锋活动总结
2014/03/09 职场文书
学生期末评语大全
2014/04/30 职场文书
债务授权委托书范本
2014/10/17 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android