当前位置: 首页 > 后端技术 > PHP

PHP正则表达式核心技术详解第二篇

时间:2023-03-29 14:39:18 PHP

作者:3#一个专注于web技术的80后,不用跟聪明人斗,只跟那些懒人斗就一定会超越大多数人!思不@吉客小俊官方首发原创企业博客:?极客君?B站地址:?哔哩哔哩?特点!可以用()表示一个需要修饰的整体()表示一个单位,例如:(w[abc])+量词是用来修饰原子的特殊字符[元字符],不能单独出现,否则会报警告错误!注意:如前所述,如果量词单独出现来匹配字符串,如果想把有意义的字符当成原子,必须使用“”转义字符转义”转义字符可以将有意的字符转换成无意义的字符如:.,*,+、?、(、<、>,不一定是量词,其他有意义的字符必须作为原子匹配转义!常用量词:表示前面可以有0个、1个或多个原子。等于{0,}:表示前面必须出现一个或多个原子,不是没有,至少有一个等价在{1,}?:表示前面的原子可以出现0次或者1次,只能有一次,或者不相等to{0,1}{}:表示用于自定义前一个原子出现的次数{X}X表示整数,{5}表示前一个原子出现5次,必须出现X次{X,Y}X和Y代表一个整数,{2,5}X必须小于Y,代表之前出现的原子,在最少X次,最多Y次,包括X和Y次,X和Y之间的次数也包括在内!{X,}表示前面的原子至少出现X次,最多出现无限次{}更多解释意思:n{X}匹配一个连续的字符串n{X,}至少包含Xns匹配一个连续的字符串n{X,Y}包含至少Xns匹配包含X或Yns的连续字符串。Defaultcase接下来,表示除换行符外的任意字符!上面的案例测试如下://*symboltest$pattern="/a9*f/";$subject='a999f';//+symboltest$pattern="/a9+f/";$subject='a999f';//?符号测试$ppattern="/a9?f/";$subject='a999f';//{}符号测试$pattern="/a9{3}f/";$subject='a999f';$pattern="/a9{1,100}f/";$subject='a999f';$pattern="/a9{1,}f/";$subject='a999f';//.符号测试$pattern="/a9.f/";$subject='a9@f';$pattern="/a9.+f/";$subject='a9@@@@@@f';//正则匹配preg_match($pattern,$subject,$arr);//自定义打印显示函数show($arr);^:出现正则表达式的第一个字符,表示必须以这个正则表达式开头,表示以什么开头$:出现正则表达式的最后一个字符,表示必须以这个regex结尾,表示以什么结尾注意:这里开头和结尾的匹配字符要看是一组字符还是单个字符。案例如下:$pattern="/^www.+com$/";$subject='www.sina.com';//正则匹配preg_match($pattern,$subject,$arr);//自定义打印显示功能显示($arr);Tips:^和$在开头和结尾的中间匹配如果没有其他任意字符,则匹配自己,案例如下$pattern="/^wwwcom$/";$subject='wwwcom';//正则匹配preg_match($pattern,$subject,$arr);//自定义打印显示函数show($arr);断言匹配基本的断言匹配就是寻找是与否之间的关系!?=n:表示前一个原子后跟指定的字符串[stringofn]。语法:'/regexp(?=n)/'案例图如下:$pattern="/you(?=are)/";$subject='现在你已经启动并运行了,这里是你很少thingsyoushouldknow.';//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印显示functionshow($arr);?!n:表示前面的原子后面没有紧跟指定的字符串[nanystring]语法:'/regexp(?!n)/'示例1:$pattern="/you(?!are)/";$subject='现在你已经启动并运行了,这里有一些你应该知道的事情。';//正则匹配preg_match_all($pattern,$subject,$arr);//从定义打印显示功能显示($arr);case例子2:指定一个后面没有h的单词$pattern="/\bp(?!h).+\b/is";$subject='phppythonperljava';//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印显示函数show($arr);断言匹配的进阶介绍后面会提到!或者用括号匹配:|:表示或关系,其优先级最低,最后考虑其功能$pattern="/www|com|http/";$subject='www.baidu.com.http';//正则匹配preg_match_all($pattern,$subject,$arr);//Customprintshowfunctionshow($arr);():括号的作用:重要的是它们都代表一个模式单元,如果需要匹配整个字符的话,你需要添加()一个。可以将一堆字符作为一个整体使用b.改变优先级,加括号可以提高优先级c.作为子模式使用,正则表达式不先匹配一个字符串匹配一次,所有匹配都作为大模式放在数组的第一个元素中,每个()作为子模式放在其他元素中排列顺序d.可以取消子模式,用括号前面的?:取消()表示的子模式,这个也可以叫:不缓存子模式,因为子模式本身就是一个内存中缓存简而言之:(?:xxxx)?如果存在则匹配,如果不存在则取消当前子模式!e.反向引用:a)可以直接从模式中提取子模式并将其用作正则表达式模式的一部分b)1采用第一个子模式,2采用第二个子模式,....5(注意单引号或者双引号括起来的规律性)双引号需要转义"\1"单引号不需要转义'1'c)如果是像替换函数preg_replace函数这样的正则表达式,则subpattern可以取出来用在被替换的字符串中d)Backreferences可以用${n}来表示,推荐使用!案例图如下:://commonmatchall$pattern="/\d{4}\W\d{2}\W\d{2}\s*\d{2}\W\d{2}\W\d{2}/";$subject='2020-05-2221:55:16';//普通匹配所有+子模式$pattern="/(\d{4}\W\d{2}\W\d{2})\s*(\d{2}\W\d{2}\W\d{2})/";$subject='2020-05-2221:55:16';//普通匹配全部+子模式+子模式嵌套$pattern="/((\d{4})\W(\d{2})\W(\d{2}))\s*(\d{2}\W\d{2}\W\d{2})/";$subject='2020-05-2221:55:16';//普通匹配全部+子模式+子模式嵌套+删除子模式$pattern="/((\d{4})\W(?:\d{2})\W(?:\d{2}))\s*(\d{2}\W\d{2}\W\d{2})/";$subject='2020-05-2221:55:16';//反向引用,注意:注意我上面说的正则单双引号,//单引号$pattern='/\d{4}(\W)\d{2}(\W)\d{2}\s*\d{2}\1\d{2}\2\d{2}/';$subject='2020:05:2221:55:16';//双引号$pattern="/\d{4}(\W)\d{2}(\W)\d{2}\s*\d{2}\\1\d{2}\\2\d{2}/";$subject='2020-05-2221-55-16';5.特殊元字符匹配边界或边界控制b:表示一个字符的边界表示以最后找到的字符为边界!表示该字符串前后没有其他字符。情况1如下:以b字符开始,以u字符结束$pattern="/\bb.+u\b/";$subject='www.baidu.com';$pattern="/\bb.+?u\b/";$subject='www.baidu.combaidu';2如下:$pattern="/\btr.+l\b/";$subject='期待一次任性的旅行,';//正则匹配preg_match_all($pattern,$subject,$arr);//自己定义打印显示函数show($arr);情况3如下//这里-?是匹配是否有负数$pattern="/-?\b\d+\b/is";$subject='cc66aaa999eee100,-56';//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印展示函数show($arr);B:表示无边界:表示字符串之前或之后还有其他字符是c连续且没有边界。情况一如下:$pattern="/\Btr.+l\b/is";$subject='期待一次任性的旅行,';//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印显示函数show($arr);Case2:$pattern="/\Bwar\B/is";$subject='期待任性的旅行,';//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印显示函数show($arr);匹配边界A:表示只匹配整个字符串的开头,不受m修饰符的影响,因为m修饰符只对^和$有效,对A无效如下case://注意字符串是双引号$subject="h1111\nh22222\nh33333";$pattern="/\Ah\d+$/m";//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印显示函数show($arr);Z:表示只匹配整个字符串的最后一端:不受m修饰符的影响,因为m修饰符只对^和$有效,但以下情况对Z无效://注意字符串是double引用$subject="h1111\nh22222\nh33333";$pattern="/^h\d+\Z/m";//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印显示函数show($arr);Tips:如果对m修饰符不理解,请看下面的介绍^.^z:表示只匹配整个字符串的末尾:但字符串末尾不能跟任何东西。例1://注意字符串是双引号$subject="h1111\nh22222\nh33333";//$subject="h1111\nh22222\nh33333aaa";//$subject="h1111\nh22222\nh33333%";$pattern="/^h\d+\z/m";//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印显示函数show($arr);例2://注意字符串是双引号$subject="h1111\nh22222\nh33333";//$subject="h1111\nh22222\nh33333aaa";//$subject="h1111\nh22222\nh33333%";$pattern="/h\d+\z/";//正则匹配preg_match_all($pattern,$subject,$arr);//自定义打印展示函数show($arr);如果我的博客对您有帮助,如果您喜欢我的博客内容,请“点赞”、“评论”、“收藏”?一键三连!大家的支持是我坚持下去的动力