欢迎光临散文网 会员登陆 & 注册

PHP正则表达式核心技术完全详解 第2节

2020-09-23 03:30 作者:极客小俊GeekerJun  | 我要投稿

      极客小俊

 一个专注于web技术的80后

你不用拼过聪明人,你只需要拼过那些懒人 你就一定会超越大部分人!




在这里插入图片描述

我们接着上一节的说

  1. 量词 量词: 是用来修饰原子的, 默认情况量词下只能修饰前一个字符!  可以使用 ( )来表示一个需要修饰的整体  ( )里面的表示一个单元、例如: (\w[abc])+

量词是一种特殊的字符,是用来专门修饰原子[元字符]用的,不可以单独出现、否则会报警告错误! 注意: 上面说过如果量词要单独出现用来匹配字符串、如果要使用有意义的字符作为原子来使用,必须使用 ”\“转义字符转义 " \ " 转义字符可以将有意的字符转成没意义的字符 例如: .、*、+、\?、 (、 <、>、也不一定必须是量词还有其他有意义的字符作为原子来匹配都必须转义! 常用量词

  • : 表示其前的原子可以出现 0个、1个、或多个     等同于   {0,}

  • : 表示其前的原子必须出现1个 或 多个,不能没有,最少要有一个    等同于   {1,} ?  :表示其前面的原子可以出现0次或1次 有只能有一次,要么没有    等同于  {0,1} {}  : 表示用于自定义前面原子出现的次数

  1. {X}   X表示一个整数, {5}表示前面的原子出现5次 就是必须出现X次

  2. {X,Y}  X和Y表示一个整数,{2,5} X要小于Y, 表示前面出现的原子,最少X次,最多Y次,包括X和Y次、并且在X与Y范围之间的次数也包括!

  3. {X,}   表示前面的原子最少出现X次, 最多无限次 { }更多解释意思: n{X} 匹配包含 X 个 n 的连续的字符串 n{X,} 匹配至少包含 X 个 n 的连续的字符串 n{X,Y} 匹配包含 X 或 Y 个 n 的连续的字符串

.   点默认情况下,表示除换行符外 任意一个字符! 以上案例测试如下:

  // * 符号测试
 $pattern="/a9*f/";
 $subject='a999f';
 
 // + 符号 测试
 $pattern="/a9+f/";
 $subject='a999f';
 
 
 // ? 符号 测试
 $pattern="/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函数
 show($arr);

^  : 正则表达式的第一个字符出现, 表示必须以这个正则开始,表示以什么开头 $  : 正则表达式的最后一个字符出现, 表示必须以这个正则结束, 表示以什么结尾 注意: 这里的开始与结尾匹配的字符要看一下是一组还是单一字符, 案例如下:

  $pattern="/^www.+com$/";
 $subject='www.sina.com';
 
 //正则匹配
 preg_match($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);

小提示: ^与$ 在开始与结尾匹配的时候 中间如果没有任何其他任意字符就是匹配自己本身,案例如下

  $pattern="/^wwwcom$/";
 $subject='wwwcom';
 
 //正则匹配
 preg_match($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);


断言匹配基础 断言匹配就是查找一个是与不是的关系! ?=n  : 表示前面的原子其后 有紧接指定的字符串  [n 的字符串]. 语法: '/regexp(?=n)/' 案例图如下:

 $pattern="/you(?= are)/";
 $subject='Now that you are up and runing, here are you are few things you should know.';
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);
 

?!n  : 表示前面的原子其后 没有紧接指定的字符串  [n 的任何字符串] 语法: '/regexp(?!n)/' 案例如1:

  $pattern="/you(?! are)/";
 $subject='Now that you are up and runing, here are you are few things you should know.';
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);

案例如2: 指定p后面不是h的单词

  $pattern="/\bp(?!h).+\b/is";
 $subject='php python perl java';
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);
 

有关断言匹配高级的介绍 后面会说到!

  1. 或者匹配 与 小括号: |   : 表示或的关系 , 它的优先级是最低的, 最后考虑它的功能

  $pattern="/www|com|http/";
 $subject='www.baidu.com.http';
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);
 

( )  :  小括号的作用: 重点 它里面的所有代表一个模式单元,如果需要匹配整体字符就需要加上() a. 可以把一堆字符作为一个整体使用 b. 改变优先级,加上括号可以提高优先级别 c. 作为子模式使用, 正则表达式不先对一个字符串匹配一次, 全部匹配作为一个大模式,放到数组的第一个元素中,每个()是一个子模式按顺序放到数组的其它元素中去。 d. 可以取消子模式, 在括号中最前面使用 ?: 就可以取消这个()表示的子模式,这种也可以称之为:不缓存子模式, 因为子模式本身就是一种缓存在内存中的数据! 总之: (?:xxxx)? 如果有就匹配,没有就取消当前子模式! e. 反向引用: a) 可以在模式中直接将子模式取出来,再作为正则表达式模式的一部分 b) \1 取第一个子模式、 \2取第二个子模式, .... \5 (注意是单引号还是双引号引起来的正则)  双引号需要转义 “\1”  单引号不需要转义 '\1' c) 如果是在正则表达式像替换函数preg_replace函数中, 可以将子模式取出, 在被替换的字符串中使用   d) 反向引用可以使用${n}来 表示 并且推荐这样使用! 案例图如下:

  //普通匹配全部
 $pattern="/\d{4}\W\d{2}\W\d{2}\s*\d{2}\W\d{2}\W\d{2}/";
 $subject='2020-05-22 21:55:16';
 
 //普通匹配全部 + 子模式
 $pattern="/(\d{4}\W\d{2}\W\d{2})\s*(\d{2}\W\d{2}\W\d{2})/";
 $subject='2020-05-22 21:55:16';
 
 
 //普通匹配全部 + 子模式 + 子模式嵌套
 $pattern="/((\d{4})\W(\d{2})\W(\d{2}))\s*(\d{2}\W\d{2}\W\d{2})/";
 $subject='2020-05-22 21:55:16';
 
 
 //普通匹配全部 + 子模式 + 子模式嵌套 + 去掉子模式
 $pattern="/((\d{4})\W(?:\d{2})\W(?:\d{2}))\s*(\d{2}\W\d{2}\W\d{2})/";
 $subject='2020-05-22 21:55:16';
 
 
 //反向引用, 注意:要注意我上面所说的正则的单双引号问题,
 
 //单引号
 $pattern='/\d{4}(\W)\d{2}(\W)\d{2}\s*\d{2}\1\d{2}\2\d{2}/';
 $subject='2020:05:22 21:55:16';
 
 //双引号
 $pattern="/\d{4}(\W)\d{2}(\W)\d{2}\s*\d{2}\\1\d{2}\\2\d{2}/";
 $subject='2020-05-22 21-55-16';

5 .  特别的元字符  匹配边界 或者叫 边界控制 \b  :  表示一个字符的边界 意思是最后找到的那个字符作为边界!  说明的是字符串前或后没有其他字符 案例1 如下: 以b字符为开始边界、以u字符结尾边界

  $pattern="/\bb.+u\b/";
 $subject='www.baidu.com';
 
 $pattern="/\bb.+?u\b/";
 $subject='www.baidu.com baidu';

案例2 如下:

  $pattern="/\btr.+l\b/";
 $subject='Look forward to a wayward travel, the';
 
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);

案例3 如下

 //这里的 -? 是匹配是否有负数
 $pattern="/-?\b\d+\b/is";
 $subject='cc 66  aaa 999 eee 100,-56';
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);

\B  : 表示一个非边界 : 说明的是字符串前或后有其他字符 是连续的 不要有边界 案例1如下:

  $pattern="/\Btr.+l\b/is";
 $subject='Look forward to a waywardtravel, the';
 
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);

案例2:

  $pattern="/\Bwar\B/is";
 $subject='Look forward to a waywardtravel, the';
 
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);

匹配边界 \A : 表示只匹配整段字符串的开头, 它不受m 修正符的影响,   因为m修正符只针对^ 和 $起作用, 但对\A无效 如下案例:

  //注意字符串是双引号
 $subject="h1111\nh22222\nh33333";
 $pattern="/\Ah\d+$/m";
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);
 

\Z: 表示只匹配整段字符串的最后结尾: 它也不受m 修正符的影响,   因为m修正符只针对^ 和 $起作用, 但对\Z无效 如下案例:

  //注意字符串是双引号
 $subject="h1111\nh22222\nh33333";
 $pattern="/^h\d+\Z/m";
 
 //正则匹配
 preg_match_all($pattern, $subject,$arr);
 //自定义打印show函数
 show($arr);

小提示: 如果对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函数
 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函数
 show($arr);

在这里插入图片描述


如果喜欢话请 点赞  投币  收藏 一键三连  

大家的支持就是我坚持下去的动力!

不要忘了👉 关注 👈哦!


PHP正则表达式核心技术完全详解 第2节的评论 (共 条)

分享到微博请遵守国家法律