正向预查与反向预查的功能和用法是什么?
Admin 2021-05-10 群英技术资讯 1052 次浏览
有时候我们需要使用正则表达式的预查功能,因此就需要了解正向预查与反向预查,这篇问文章就主要给大家介绍正向预查与反向预查的作用以及用法,具有一定的参考价值,感兴趣的朋友就继续往下看吧。
了解正向预查&反向预查前,我们先要知道正则的2个函数:preg_match_all 、 preg_replace
正向或反向预查都是非获取匹配,不进行存储供以后使用。
(?:pattern) 匹配结果
(?=pattern) 正向匹配
(?!pattern) 正向不匹配
(?<=pattern) 反向匹配。
(?<!pattern) 反向不匹配。
什么叫非获取匹配(非捕获匹配),请看例子
$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 的替换内容,是匹配全文的中内容,对应元素的替换。
$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中,我们发现没有括号匹配的结果,这就是我们说的非获取匹配,只匹配全本结果,不捕获括号中的子结果。
$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
$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
$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正则的内容大家可以继续关注其他文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
PHP中CI框架的运行模式:1、创建了控制器,abc是视图的文件.例如abc.php;2、视图代码,其实这个就等于GET方法.POST方法,基本内容上比较简单。
本文的主题内容则是给大家介绍PHP中fgets、fgetss和fgetcsv函数的具体区别有哪些!其实这3个函数都是有关PHP中文件操作类的函数,为了让大家能熟练掌握在不同情况下使用不同函数,我就给大家总结一下他们之间的区别。
找到xampp文件夹中的php.ini文件,搜索“extension”,修改extension_dir="xxx"(xxx为ext所在位置);修改为extension=mysqli;Run->Edit Configurations选项。
这篇文章主要介绍了PHP封装请求类,结合实例形式分析了基于Yii框架的curl封装请求处理的相关实现技巧,需要的朋友可以参考下
将spyder改为中文的方法:1、下载汉化包,然后解压下载的包。2、在cmd中运行解压包中的main.py文件。3、在Spyder中将语言改为简体中文即可。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008