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读取msn上的用户信息类
Dec 05 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
利用PHP+JS实现搜索自动提示(实例)
Jun 09 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
php学习笔记之面向对象
Nov 08 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
Mar 17 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 PHP
php获取是星期几的的一些常用姿势
Dec 15 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
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
详解JWT token心得与使用实例
2019/08/02 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
vue3.0 上手体验
2020/09/21 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python实现的二维码生成小软件
2014/07/11 Python
python字典序问题实例
2014/09/26 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
flask-restful使用总结
2018/12/04 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
四种会话跟踪技术
2015/05/20 面试题
工程管理专业毕业生自荐信
2014/01/24 职场文书
辞职书格式样本
2015/02/26 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书