• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>php与正则表达式

php与正则表达式

正则表达式概述

正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是一种描述字符结构的语法规则,是一个特定的格式化模式。它可以匹配、替换、截取匹配的字符串。对于用户来说,在Windows资源管理器中参照某个目录下的所有jpg图像,可以输入“*jpg”,按【enter】键后,所有的“jpg”文件都会被列出来,这里的“*jpg”就可以理解为一个简单的正则表达式。

正则表达式几个容易混淆的技术

  • grep:最初是ED编辑器中的一条指令,用来显示文件中的特定的内容,后来成为一个独立的工具grep
  • egrep:grep虽然不断地更新升级,但仍然无法跟上技术的脚步,为此,贝尔实验室推出来egrep,意味“扩展的grep”,大大增加了正则表达式的功能
  • POSIX(Portable Operating System Interface of Unix,可移植操作系统的接口):在grep发展的同事,其他一些开放人员也按照自己喜好开发了具有独特风格的版本。但问题也随之而来,有的程序支持某个元字符,而有的程序不支持。因此就有POSIX,POSIX是一系列标准,确保了操作系统之间的可移植性,但POSIX和SQL一样,没有成为最终的标准而只能作为一个参考。
  • perl(Practical Extraction and Reporting Language,实际抽取与汇报语言):1987年,拉里·沃尔(Larry Wall)发布了Perl.在随后的7年里,Perl经历了从Perll到Perl5的发展,最终Perl成为了一个标准
  • PCRE:Perl的成功,让其他的开发人员在某种程度上要兼容Perl,包括C/C++、java、Python等有自己的正则表达式1997年,Philip Hazel开发了PCRE库,这是兼容Per!正则表达式的一套正则引擎,其他开发人员可以将PCRE整合到自己的语言中,为用户提供丰富的正则功能。许多软件都使用PCRE, PHP正是其中之一

正则表达式语法规则

定位符(^、$、\b、\B)

在程序开发时,经常需要确定字符在字符串中的具体方位。如,判断某行文字是否是章节的标题,这是,可以使用定位符来实现。正则表达式支持定位功能,它可以确定字符在字符串中的具体方位(如字符创头部或尾部,或者单词的表姐)正则表达式中的定位符如下所示;

字符 说明
^ 匹配输入字符串的开始位置
$ 匹配输入字符串结尾的位置
\b 匹配一个字便捷,也就是指单词和空格间的位置
\B 匹配非单词边界

具体示例如下

^prefer //该表达式表示要匹配以prefer开头的字符创,如“I prefer this colour”可以匹配
itcast$ //该表达式要匹配以prefer结尾的字符创,如“welacome to itcast”可以匹配
er\b //匹配er和空格间的位置,如匹配“never”的而,但不能匹配“verb”的er
er\B //匹配在不在边界的er,如可以匹配“verd”的er,但不能匹配never的er

字符类[]

正则表达式是区分大小写的,如果忽略大小写,我们就可以使用方括号表示[]。一个方括号只能匹配一个字符,并且只要匹配的字符出现在方括号内,就表示匹配成功。

如,要匹配字符串“Hi”不区分大小写,格式为:“[Hi] [Ii]”;如hi,Hi、hI、HI都可以匹配

针对字符类的常见使用,POSIX和PCRE都使用了一些预定义字符类,但表示风格有所不同,POSIX风格的预定义字符类如下所示:

预定义字符类 说明
[:alnum:] 匹配字面和数字字符。等同于A~Z,a~z,0~9
[:alpha:] 匹配字母字符。等同于A~Z,a~z
[:blank:] 匹配空格或制表符
[:cntrl:] 匹配控制字符
[:digit:] 匹配十进制数字。等同于0~9
[:graph:] 匹配ASCII码值范围33~126的字符。与[:print:]相似,但不包括空格字符
[:print:] 与[:graph:]相同,但多了空格字符
[:lower:] 匹配小写字母,等同于a~z
[:upper:] 匹配大写字母,等同于A~Z
[:space:] 匹配空白字符(空格和制表符)
[:xdigit:] 匹配十六进制数字。等同于0~9,A~F,a~f

选择字符(|)

在正则表达式中,如果忽略字符串的大小写,除了可以使用方括号([])实现外,还能使用选择字符(|)该字符可以理解为“或”。

如:匹配“hi”不区分大小写,表示方式为“(H|h) (I|i)”。表示以字母H或h开头,后面接一个I或i,等同于[Hh][Ii]

注意:“[]”和“|”区别在于[]只能匹配单个字符,而|可以匹配任意长度的字符。

连字符(-)

在php中,变量只能以字母和下划线开头,如果使用正则表达式来匹配变量名的第一个做字幕,就需要写成以下这种方式:

[abcefghijklmnopqrstuvwxyzABCDFEGHIJKLMNOPQRSTUVWXYZ]

上述写法将26个字母的大小写都全部写一遍,这无疑是非常麻烦的,这时可以使用正则表达式连字符“-”来简化表达式。

当使用连字符只能字符列表时,需要指定起始字符和结束字符,如,要匹配所有大小写字母,可以写成以下方式

[a-zA-Z]

注意:

1.字符范围是遵循字符编码的顺序来匹配,也就是说,如果要测试的字符恰好是按照字符编码的排列顺序是,就可以使用这种表达式来表示

2.注意在字符类内部不要空格,否则会被认为要匹配一个空格

3.在通常情况下,字符“-”都只表示一个普通字符,只有在表示范围时才被作为元字符来使用

反义字符([^])

有时候,我们需要匹配除某些其他字符外的其他字符,这时可以使用反义字符来实现。反义字符就是除了字符中指定的字符以外的任意字符。如果在字符内部添加"^"前缀,即定义了反义字符

如,要匹配除数字以为的任意的字符,可以采用下列表达式

[^0123456789]

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

对于重复出现的字母或字符串,可以使用限定字符来实现。

字符 说明 举例
? 匹配前面的字符0次或1次 colou?r,可以匹配colour和color
+ 匹配前面的字符1次或多次 go+gle,可以匹配的范围从gole到go…gle
* 匹配前面的字符0次或多次 go*gle,可以匹配的范围从gole到go…gle
{n} 匹配前面的字符n次 go{2}gle,只匹配google
{n,} 匹配前面的字符最多n次 go{n,}gle,可以匹配的范围从gole到go…gle
{n,m} 匹配前面的字符最少n次最多m次 employe{0,2},可以匹配employ、employe、employee三种情况

注意:当使用元字符“*”和“?”时,由于这些字符可能匹配前面字符或表达式0次,所以它们允许什么都不匹配。如表达式/a*/实际上与字符串“bcd”匹配,因为改字符串含有0个字符“a”

点字符(.)

在评论中,需要对用户发布的帖子进行审核,看其中内容是否包含一些非法字符,而过滤其中的非法字符可以使用点字符来完成

在正则表达式中,点字符“.”可以匹配换行字符外的任意一个字符,如,匹配以“s”开头“t”结尾,中间包含子一个字母的单词的表达式如下

^s.t$

上述表达式可以匹配多个单词,如set、sat、sit等

转义字符(\)

正则表达式中的转义字符“\”和php大同小异。都是将特殊字符(如*、?、/等)变为普通字符。

如,匹配127.0.0.1这样的ip地址,如果直接使用点字符,会写成下列表达式

[0-9]{1,3}(.[0-9]{1,3}){3}

上述表达式虽然可以匹配127.0.0.1,但也可以匹配1271010011这样的字符串,所以要将“.”当作一个普通字符,需要使用转义字符“\”,进行修改

[0-9]{1,3}(\.[0-9]{1,3}){3}

反斜杆(\)

在正则表达式中。“\”除了可以作为转义自户外,还有其他功能如,显示一些不可打印的字符、指定预定义字符集、定义一些限定字符。

反斜杆输出不可打印字符

字符 说明
\a 警报,即ASCLL中的<BEL>字符
\b 退格,即ASCLL中的<BS>字符
\e Escape,即ASCLL中的<ESC>字符
\f 换页符,即ASCLL中的<FF>字符
\n 换行符,即ASCLL中的<LF>字符
\r 回车符,即ASCLL中的<CR>字符
\t 水平制表符,即ASCLL中的<HT>字符
\xhh 十六进制代码
\ddd 八进制代码
\\cx 即comtroi-x的缩写,匹配x指定的控制字符,其中x是任意字符

反斜杆指定的预定义字符集

字符 说明
\d 任意一个十进制数,相当于[0-9]
\D 任意一个非十进制数
\s 任意一个空白字符(空格、换行符、换页符、会回车符、水平制表符)相当于[\f\f\r\t]
\S 任意一个非空白字符
\w 任意一个单词字符相当于[a-zA-Z0-9]
\W 任意一个非单词字符

反斜线定义断言的限定字符

字符 说明
\b 单词分界符,用来匹配字符串中的某些位置
\B 非单词分界符序列
\A 总是能够匹配待搜索文本的起始位置
\Z 表示在未指定任何模式下匹配的字符,通常是字符串的末尾位置,或者在字符串末尾的换行符之前的位置
\z 只匹配字符串末尾,而不考虑任何换行符
\G 当前匹配的起始位置

括号字符(())

在正则表达式中,括号字符“()”有两个作用,一是改变限定字符的作用范围;而是分组。

(1).改变限定字符的作用范围

(thir|four)th

上述表达式用于匹配单词thirth或fourth,如果不使用小括号,那么就变成了匹配单词thir或fourth了

(2).分组,对于表达式进行重复操作

(\.[0-9]{1,3}){3}

付分组(\.[0-9]{1,3})进行3次重复操作