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 相关文章推荐
用ODBC的分页显示
Oct 09 PHP
UCenter Home二次开发指南
May 28 PHP
PHP MySQL应用中使用XOR运算加密算法分享
Aug 28 PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
PHP之十六个魔术方法详细介绍
Nov 01 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
php封装的page分页类完整实例代码
Feb 01 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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发邮件类
2016/08/29 PHP
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
python文件操作的简单方法总结
2019/11/07 Python
Python文件操作函数用法实例详解
2019/12/24 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
python 下划线的不同用法
2020/10/24 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
Python实现简单的2048小游戏
2021/03/01 Python
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
临床医学应届生求职信
2013/11/06 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
高中军训感言800字
2014/03/05 职场文书
投资意向书范本
2014/04/01 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
军事理论课感想
2015/08/11 职场文书
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL