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 相关文章推荐
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
Aug 14 PHP
PHP动态页生成静态页的3种常用方法
Nov 13 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 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扩展
2013/06/13 PHP
php session 写入数据库
2016/02/13 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
php微信开发之关注事件
2018/06/14 PHP
js查找父节点的简单方法
2008/06/28 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python导入txt数据到mysql的方法
2015/04/08 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
python中append实例用法总结
2019/07/30 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
购买一个高级域名:BuyDomains
2018/03/11 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
师范生自荐信
2013/10/27 职场文书
行政助理岗位职责范文
2013/12/03 职场文书
优秀党员事迹材料
2014/12/18 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
2016年母亲节广告语
2016/01/28 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
PL350与SW11的比较
2021/04/22 无线电