php中正则表达式总结(不容错过)

php中正则表达式总结(不容错过)

一、总结

一句话总结:

无论js,php,java,python里面中的正则都是差不多一样的,所以用点脑子
用到正则的地方很多,比如 nginx的配置文件

 

1、php正则中 行定位符(行定位符是用来描述字符串的边界) 是什么?

^与$:“$”表示行结尾“^”表示行开始
如"^de",表示以de开头的字符串 "de$",表示以de结尾的字符串。

 

2、php正则中 (单词定界符)怎样才能让其匹配单词,而不是单词的一部分呢?

单词定界符\b:\b an \b 去匹配”gril and body”的话,就会提示匹配不到。

 

3、php正则中 选择字符(表示或)  是什么?

|:如Aa|aA,表示Aa或者是aA的意思

 

4、php正则中 使用”[]”与”|”的区别 是什么?

”[]”只能匹配单个字符,而”|”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。

 

5、php正则中 排除字符(排除操作) 是什么?

”^”来表示排除不符合的字符:^一般放在[]中。如[^1-5],该字符不是1~5之间的数字。

 

6、php正则中 限定符?表示什么意思?

零次或一次

 

7、php正则中 限定符*表示什么意思?

零次或多次

 

8、php正则中 限定符+表示什么意思?

一次或多次

 

9、php正则中 限定符{n,}表示什么意思?

至少n次

 

10、php正则中 点号操作符  表示什么意思?

匹配任意一个字符(不包含换行符)

 

 

11、php正则中 括号字符()的作用有哪些?

改变限定符如(|、* 、^)的作用范围 :如(my|your)baby,如果没有”()”,|将匹配的是要么是my,要么是yourbaby,有了小括号,匹配的就是mybaby或yourbaby。
进行分组,便于反向引用

 

12、php正则中 反向引用  表示什么意思?

如(dqs)(pps)\1\2,表示匹配字符串dqsppsdqspps。

 

13、php正则中 模式修饰符 有哪些?

i     忽略大小写
m     多文本模式
s     单行文本模式
x     忽略空白字符

 

14、php正则中 *? 表示什么意思?

零次或多次,但尽可能少的匹配

 

 

15、php正则中 {n,}? 表示什么意思?

至少n次,但尽可能少的匹配

 

16、php正则中 ?? 表示什么意思?

0次或1次,但尽可能少的匹配

 

17、php正则中 {n,m}? 表示什么意思?

n到m次 ,但尽可能少的匹配

 

18、php正则中 指定预定义的字符集\d和\D分别表示什么意思?

\d     任意一个十进制数字[0-9]
\D     任意一个非十进制数字

 

19、php正则中 指定预定义的字符集\s和\S分别表示什么意思?

\s     任意一个空白字符(空格、换行符、换页符、回车符、字表符)
\S     任意一个非空白字符

 

20、php正则中 指定预定义的字符集\w和\W分别表示什么意思?

\w     任意一个单词字符
\W     任意个非单词字符

 

 

 

二、php中正则表达式详解

转自或参考:php中正则表达式详解
https://www.cnblogs.com/hellohell/p/5718319.html

概述

正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字符串。常用的语言基本上都有正则表达式,如JavaScript、java等。其实,只有了解一种语言的正则使用,其他语言的正则使用起来,就相对简单些。文本主要围绕解决下面问题展开。

  • 有哪些常用的转义字符
  • 什么是限定符与定位符
  • 什么是单词定位符
  • 特殊字符有哪些
  • 什么是逆向引用以及怎样使用逆向引用
  • 匹配模式
  • php中怎样使用正则表达式
  • php中哪些方面需要用到正则
  • 怎样进行邮箱匹配,url匹配,手机匹配
  • 怎样使用正则替换字符串中某些字符
  • 贪婪匹配与惰性匹配区别
  • 正则表达式之回溯与固态分组
  • 正则优缺点有哪些

正则表达式的基本知识汇总

行定位符(^与$)

行定位符是用来描述字符串的边界。“$”表示行结尾“^”表示行开始如"^de",表示以de开头的字符串 "de$",表示以de结尾的字符串。

单词定界符

我们在查找的一个单词的时候,如an是否在一个字符串”gril and body”中存在,很明显如果匹配的话,an肯定是可以匹配字符串“gril and body”匹配到,怎样才能让其匹配单词,而不是单词的一部分呢?这时候,我们可以是哟个单词定界符\b。 
\ban\b 去匹配”gril and body”的话,就会提示匹配不到。 
当然还有一个大写的\B,它的意思,和\b正好相反,它匹配的字符串不能使一个完整的单词,而是其他单词或字符串中的一部分。如\Ban\B。

选择字符(|) ,表示或

选择字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用”[]”与”|”的区别,在于”[]”只能匹配单个字符,而”|”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。

排除字符,排除操作

正则表达式提供了”^”来表示排除不符合的字符,^一般放在[]中。如[^1-5],该字符不是1~5之间的数字。

限定符(?*+{n,m})

限定符主要是用来限定每个字符串出现的次数。

限定字符含义
零次或一次
*零次或多次
+一次或多次
{n}n次
{n,}至少n次
{n,m}n到m次

如(D+)表示一个或多个D

点号操作符

匹配任意一个字符(不包含换行符)

表达式中的反斜杠(\)

表达式中的反斜杠有多重意义,如转义、指定预定义的字符集、定义断言、显示不打印的字符。

转义字符

转义字符主要是将一些特殊字符转为普通字符。而这些常用特殊字符有”.”,”?”、”\”等。

指定预定义的字符集

字符含义
\d任意一个十进制数字[0-9]
\D任意一个非十进制数字
\s任意一个空白字符(空格、换行符、换页符、回车符、字表符)
\S任意一个非空白字符
\w任意一个单词字符
\W任意个非单词字符

###显示不可打印的字符

字符含义
\a报警
\b退格
\f换页
\n换行
\r回车
\t字表符

括号字符()

在正则表达式中小括号的作用主要有:

  • 改变限定符如(|、* 、^)的作用范围 
    如(my|your)baby,如果没有”()”,|将匹配的是要么是my,要么是yourbaby,有了小括号,匹配的就是mybaby或yourbaby。
  • 进行分组,便于反向引用

反向引用

反向引用,就是依靠子表达式的”记忆”功能,匹配连续出现的字串或是字符。如(dqs)(pps)\1\2,表示匹配字符串dqsppsdqspps。在下面php应用中,我将详细展开学习反向引用。

模式修饰符

模式修饰符的作用是设定模式,也就是正则表达式如何解释。php中主要模式如下表:

修饰符说明
i忽略大小写
m多文本模式
s单行文本模式
x忽略空白字符

正则表达式在php中应用

php中字符串匹配

所谓的字符串匹配,言外之意就是判断一个字符串中,是否包含或是等于另一个字符串。如果不使用正则,我们可以使用php中提供了很多方法进行这样的判断。

不使用正则匹配

  • strstr函数 
    string strstr ( string haystack,mixedneedle [, bool $before_needle = false ]) 
    • 注1:haystackneedle是被查找的字符串。该函数区分大小写。
    • 注2:返回值是从needle开始到最后。
    • 注3:关于$needle,如果不是字符串,被当作整形来作为字符的序号来使用。
    • 注4:before_needle若为true,则返回前东西。
  • stristr函数与strstr函数相同,只是它不区分大小写
  • strpo函数 
    int strpos ( string haystack,mixedneedle [, int $offset = 0 ] ) 
    注1:可选的 offset 参数可以用来指定从 haystack 中的哪一个字符开始查找。返回的数字位置是相对于 haystack 的起始位置而言的。
  • stripos -查找字符串首次出现的位置(不区分大小定)
  • strrpos -计算指定字符串在目标字符串中最后一次出现的位置
  • strripos -计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写

使用正则进行匹配

在php中,提供了preg_math()和preg_match_all函数进行正则匹配。关于这两个函数原型如下:


int preg_match|preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜索subject与pattern给定的正则表达式的一个匹配. 
pattern:要搜索的模式,字符串类型。 
subject :输入字符串。 
matches:如果提供了参数matches,它将被填充为搜索结果。 matches[0]matches[1]将包含第一个捕获子组匹配到的文本,以此类推。 
flags:flags可以被设置为以下标记值:PREG_OFFSET_CAPTURE 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。 
offset:通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。 
返回值:preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为 preg_match()在第一次匹配后 将会停止搜索。 preg_match_all()不同于此,它会一直搜索subject直到到达结尾。 如果发生错误 preg_match()返回 FALSE。

实例

  • 实例1 
    判断字符串”http://blog.csdn.net/hsd2012“中是否包含csdn? 
    解法一(不适用正则): 
    如果不适用正则,我们使用strstr或者strpos中任意一个都可以,在此,我将使用strstr函数,代码如下:
$str='http://blog.csdn.net/hsd2012';
function checkStr1($str,$str2) { return strstr1($str,$str2)?true:false; } echo checkStr($str,'csdn');

解法二:使用正则 
因为我们只需要判断是否存在即可,所以选择preg_match。

$str='http://blog.csdn.net/hsd2012';
$pattern='/csdn/';
function checkStr2($str,$str2) { return preg_match($str2,$str)?true:false; } echo checkStr2($str,$pattern);
  • 实例2(考察单词定界符) 
    判断字符串”I am a good boy”中是否包含单词go 
    首先判断是单词,而不是字符串,因此比较的时候,需要比较是否包含’ go ‘,即在字符串go前后有一个空格。 
    解析:如果使用非正则比较,只需要调用上面的checkStr1()函数即可,注意,第二个参数前后要加一个空格,即’ go ‘。如果使用正则, 
    我们可以考虑使用单词定界符\b,那么$pattern=’/\bgo\b/’;然后调用checkStr2函数即可.
  • 例3(考察反向引用
    判断字符串”I am a good boy”中是否包含3个相同的字母 
    解析:此时,如果我们不使用正则,将会很难判断,因为字母太多了,我们不可能去将所有字母分别与该字符串比较,那样工作量也比较大。这时候涉及到了正在的反向引用。在php正则表达式中,通过\n,来表示第n次匹配到的结果。如\5代表第五次匹配到的结果。那么本题的$pattern='/(\w).*\1.*\1/'; 
    主要注意的是,在使用反向匹配的时候都需要使用(),反向匹配时,匹配()里面出现的字符或字符串。

php中字符串替换

不使用正则

php中当替换字符串的时候,如果不适用正则,我们通常使用substr、mb_substr、str_replace、substr_replace关于这几个函数区别如下表。

函数符功能描述
str_replace(find,replace,string,count)使用一个字符串替换字符串中的另一些字符。find 必需。规定要查找的值。replace 必需。规定替换 find 中的值的值。string 必需。规定被搜索的字符串。count 可选。一个变量,对替换数进行计数。
substr_replace(string,replacement,start,length)把字符串的一部分替换为另一个字符串。适合用于替换自定位置的字符串。string 必需。规定要检查的字符串。replacement 必需。规定要插入的字符串。start 必需。规定在字符串的何处开始替换。

使用正则

如果使用正则替换,php中提供了preg_replace _callback和preg_replace 函数,preg_replace 原型如下: 
mixed preg_replace ( mixed pattern,mixedreplacement , mixed subject[,intlimit = -1 [, int &count]])subject中,查找pattern,使replacement 去替换,如果有limitlimitpregreplacecallbackpregreplacepregreplaceback使callbackreplacement.1hello,hello;

转载于:https://www.cnblogs.com/Renyi-Fan/p/10990312.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值