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 09 PHP
编写自己的php扩展函数
Oct 09 PHP
php 小乘法表实现代码
Jul 16 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
php checkdate、getdate等日期时间函数操作详解
Mar 11 PHP
php读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
Yii2 assets清除缓存的方法
May 16 PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 PHP
php+ajax实现文件切割上传功能示例
Mar 03 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
python生成器表达式和列表解析
2016/03/10 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
教师专业自荐信
2014/05/31 职场文书
党员个人整改措施
2014/10/24 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
门面房租房协议书
2014/12/01 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书