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 相关文章推荐
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
c#中的实现php中的preg_replace
Dec 21 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
PHP独立Session数据库存储操作类分享
Jun 11 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
PHP实现HTTP断点续传的方法
Jun 17 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
CI框架实现创建自定义类库的方法
Dec 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中simplexml_load_string使用实例分享
2014/02/13 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
js 通用订单代码
2013/12/23 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
python提示No module named images的解决方法
2014/09/29 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
python打包成so文件过程解析
2019/09/28 Python
python tornado使用流生成图片的例子
2019/11/18 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
几道PHP面试题
2013/04/14 面试题
路政管理专业个人自荐信范文
2013/11/30 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
Python使用DFA算法过滤内容敏感词
2022/04/22 Python