PHP正则 正向预查&反向预查
了解正向预查&反向预查前,我们先要知道正则的2个函数:preg_match_all 、 preg_replace
preg_match_all 可以看文章:点击查看
preg_replace 可以看文章:点击查看
正向预查&反向预查
正向或反向预查都是非获取匹配,不进行存储供以后使用。
1、正向预查
(?:pattern) 匹配结果
(?=pattern) 正向匹配。
(?!pattern) 正向不匹配。
2、反向预查
(?<=pattern) 反向匹配。
(?<!pattern) 反向不匹配。
什么叫非获取匹配(非捕获匹配),请看例子
一:正向预查
例1 :获取匹配
- $str = 'XXXXjava6java7XXXX';
- $perg = "/java(6|7)/"; //匹配java6 获取 java7
- 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"
- }
- }
知道了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 的替换内容,是匹配全文的中内容,对应元素的替换。
- 例2:匹配结果
- $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"
- }
- }
对比1中,我们发现没有括号匹配的结果,这就是我们说的非获取匹配,只匹配全本结果,不捕获括号中的子结果。
- 例3:正向匹配
- $str = 'XXXXjava6java7XXXX';
- $perg = "/java(?=6|7)/";
- preg_match_all($perg, $str, $matchs);
- $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"
- var_dump("<pre>", $matchs, $str1);die;
- $match 输出结果:
- array(1) {
- [0]=>
- array(2) {
- [0]=>
- string(4) "java"
- [1]=>
- string(4) "java"
- }
- }
相比上面的我们匹配的结果中没有 6,7.
例4:正向不匹配
- $perg = "/java(?!6)/"; //不匹配java6
- preg_match_all($perg, $str, $matchs);
- $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"
- var_dump("<pre>", $matchs, $str1);die;
- $match 输出结果:
- array(1) {
- [0]=>
- array(1) {
- [0]=>
- string(4) "java"
- }
- }
这里匹配的到结果是java7,但是由于我们用了非获取匹配,就不存贮7,剩下的就是java了
主要:不管是怎么替换,如果我们只要用的是 \0(完整匹配结果) 中的结果进行替换,相当于匹配到了什么就替换掉原字符串中的什么,实际上原字符串没变化,
二 . 反向预查
- (?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java7
- (?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java7
总结:
正向预查,反向预查,就是方向不同。如:正向预查时,具体字符串在左边,/java(?:6|7)/,从字符串开始向右查找;反向则在右边: / (?<=J)a /,从字符串向反方向(左)查找。
PHP正则 正向预查&反向预查的更多相关文章
- Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索"
Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索" //匹配右边 var reg: TPerlRegEx; begin ...
- 【反向并查集、联通图】P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- DNS 正向查找与反向查找
原创地址:http://www.cnblogs.com/jfzhu/p/3996323.html 转载请注明出处 所谓正向查找,就是说在这个区域里的记录可以依据名称来查找对应的IP地址.反向查找就是在 ...
- ORM查询之基于对象的正向查询与反向查询
一.为什么有正向查询和反向查询? 举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应. 那么在实际 ...
- [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...
- Apache 正向代理与反向代理配置
Apache提供了 mod_proxy 模块用于提供代理服务,能够支持的包括正向代理.反向代理.透明代理.缓存.负载均衡,HTTP代理.FTP代理.SSL代理等若干强大的功能. 配置代理方法很简单那, ...
- nginx正向代理,反向代理,透明代理(总结)
1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连 ...
- 正向代理与反向代理的区别【Nginx读书笔记】
正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我 ...
- 正向代理与反向代理的区别【Nginx读书笔记】(zz)
正向代理与反向代理的区别[Nginx读书笔记] 正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 ...
随机推荐
- JAVA基础知识|继承的几个问题
1.子类从父类继承了什么? 子类拥有父类非private的属性,方法. 2.子类可以操作父类的非private属性吗? 子类不能继承父类的私有属性,但是如果父类中的非private方法影响到了私有属性 ...
- 《Glibc内存管理》笔记DAY5
目录 分箱式内存管理 Unsorted bin Fast bins 核心结构体分析 malloc_state 内容来源 分箱式内存管理 Unsorted bin Unsorted bin 可以看作 ...
- jQuery Ajax calls and the Html.AntiForgeryToken()
jQuery Ajax calls and the Html.AntiForgeryToken() https://stackoverflow.com/a/4074289/3782855 I use ...
- IIS URL Rewriting and ASP.NET Routing
IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...
- Android中为什么主线程不会因为Looper.loop()方法造成阻塞
很多人都对Handler的机制有所了解,如果不是很熟悉的可以看看我 如果看过源码的人都知道,在处理消息的时候使用了Looper.loop()方法,并且在该方法中进入了一个死循环,同时Looper.lo ...
- Docker 部署 ELK 收集 Nginx 日志
一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...
- PAT 甲级 1043 Is It a Binary Search Tree (25 分)(链表建树前序后序遍历)*不会用链表建树 *看不懂题
1043 Is It a Binary Search Tree (25 分) A Binary Search Tree (BST) is recursively defined as a bina ...
- (一)Rational Rose 2007 下载安装
因为有画UML图的需求,所以得在电脑上安装Rational Rose.开始准备安装Rational Rose 2003,但是破解过程过于繁琐而且似乎一直遇到各种问题,就决定安装Rational Ros ...
- redis 内存数据库
redis,如果key存在test:a:b 有冒号情况,则在RedisDesktopManager 工具中,可以分文件夹 操作hash // //操作哈希 // client.SetEntryInHa ...
- (转)华为 安卓手机在MAC系统下 ADB 识别
使用MACOS发现在Android开发环境完整的情况下,接入小米,SAMSUNG,HTC,ZTE等手机都可以自动识别,如果暂时不能识别,只需要在 adb_usb.ini 中设置之后也可以识别,并可以在 ...