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显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 PHP
php懒人函数 自动添加数据
Jun 28 PHP
PHP版国家代码、缩写查询函数代码
Aug 14 PHP
PHP远程采集图片详细教程
Jul 01 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP实现原比例生成缩略图的方法
Feb 03 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
统计PHP目录中的文件数方法
Mar 05 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 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
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
JS前端笔试题分析
2016/12/19 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python标准库之collections包的使用教程
2017/04/27 Python
python爬取淘宝商品销量信息
2018/11/16 Python
python实现dijkstra最短路由算法
2019/01/17 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
StubHub德国:购买和出售门票
2017/09/06 全球购物
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
介绍下Lucene建立索引的过程
2016/03/02 面试题
房地产销售员的自我评价分享
2013/12/04 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
爱心捐书活动总结
2014/07/05 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
家装电话营销开场白
2015/05/29 职场文书
2016年教代会开幕词
2016/03/04 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android