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 相关文章推荐
调整优化您的LAMP应用程序的5种简单方法
Jun 26 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
php上传大文件设置方法
Apr 14 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
PHP延迟静态绑定的深入讲解
Apr 02 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 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 错误之引号中使用变量
2009/05/04 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
python 如何停止一个死循环的线程
2020/11/24 Python
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
ktv中秋节活动方案
2014/01/30 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
法院授权委托书范文
2014/08/02 职场文书
表扬稿格式范文
2015/01/16 职场文书
Mysql排序的特性详情
2021/11/01 MySQL
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技