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 相关文章推荐
Smarty结合Ajax实现无刷新留言本实例
Jan 02 PHP
Dedecms常用函数解析
Feb 01 PHP
MySQL 日期时间函数常用总结
Jun 12 PHP
php语言流程控制中的主动与被动
Nov 05 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
Laravel框架用户登陆身份验证实现方法详解
Sep 14 PHP
PHP应用跨时区功能的实现方法
Mar 21 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函数,php爱好者站推荐
2007/03/19 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
python版学生管理系统
2018/01/10 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
python用requests实现http请求代码实例
2019/10/31 Python
python如何输出反斜杠
2020/06/18 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
毕业生在校学习的自我评价分享
2013/10/08 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
高一新生军训感言
2014/03/02 职场文书
法人代表委托书
2014/04/04 职场文书
节约用电标语
2014/06/17 职场文书
物理教育专业求职信
2014/06/25 职场文书
邀请函模板
2015/02/02 职场文书