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解析html的实现代码
Aug 08 PHP
PHP排序之二维数组的按照字母排序实现代码
Aug 13 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
PHP小教程之实现链表
Jun 09 PHP
cakephp打印sql语句的方法
Feb 13 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
php 数组随机取值的简单实例
May 23 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
mongodb和php的用法详解
Mar 25 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 in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
php微信公众平台开发类实例
2015/04/01 PHP
Add a Table to a Word Document
2007/06/15 Javascript
javascript 写类方式之一
2009/07/05 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
Python 常用的安装Module方式汇总
2017/05/06 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
文员自我评价怎么写
2013/09/19 职场文书
企业文化演讲稿
2014/05/20 职场文书
2014年维稳工作总结
2014/11/18 职场文书
2014年质检工作总结
2014/11/26 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
黑白记忆观后感
2015/06/18 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技