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 解决旧系统 查出所有数据分页的类
Aug 27 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
PHP获取不了React Native Fecth参数的解决办法
Aug 26 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
PHP使用QR Code生成二维码实例
Jul 07 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使用curl发送json格式数据实例
2013/12/17 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
Python反射的用法实例分析
2018/02/11 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
信息管理员岗位职责
2013/12/01 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏