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 相关文章推荐
vBulletin Forum 2.3.xx SQL Injection
Oct 09 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
php之Memcache学习笔记
Jun 17 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
PHP调用JAVA的WebService简单实例
Mar 11 PHP
初识php MVC
Sep 10 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
php中header跳转使用include包含解决参数丢失问题
May 08 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
通过代码实例解析PHP session工作原理
Dec 11 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启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
python数据结构之图深度优先和广度优先实例详解
2015/07/08 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
pycharm配置git(图文教程)
2019/08/16 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
详解Python流程控制语句
2020/10/28 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
教师实习自我鉴定
2013/12/14 职场文书
集中整治工作方案
2014/05/01 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏