上一篇: php与session技术
下一篇: php与PCRE兼容正则表达式函数
正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是一种描述字符结构的语法规则,是一个特定的格式化模式。它可以匹配、替换、截取匹配的字符串。对于用户来说,在Windows资源管理器中参照某个目录下的所有jpg图像,可以输入“*jpg”,按【enter】键后,所有的“jpg”文件都会被列出来,这里的“*jpg”就可以理解为一个简单的正则表达式。
在程序开发时,经常需要确定字符在字符串中的具体方位。如,判断某行文字是否是章节的标题,这是,可以使用定位符来实现。正则表达式支持定位功能,它可以确定字符在字符串中的具体方位(如字符创头部或尾部,或者单词的表姐)正则表达式中的定位符如下所示;
字符 | 说明 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串结尾的位置 |
\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]
对于重复出现的字母或字符串,可以使用限定字符来实现。
字符 | 说明 | 举例 |
? | 匹配前面的字符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次重复操作
上一篇: php与session技术
下一篇: php与PCRE兼容正则表达式函数
*声明:内容来源于网络收集和整理,版权归原著所有,如来源信息有误或侵犯权益,请联系站长作修改和删除处理。