1. 一个标准的正则表达式分为3个部分:分隔符、表达式和修饰符。
1.1 分隔符用来包裹表达式,可以是除了特殊字符意外的任何字符,常用的分隔符是' / '。表达式由一些特殊字符(即元字符)和非特殊字符(即文本字符)组成,比如' [a-z0-9_-]+@[a-z0-9_-]+ '是一个合法的表达式,可以匹配一个简单的电子邮件字符串。修饰符用来开始或者关闭某种功能或模式。
1.2 在正则表达式中,有12个字符被保留作为特殊用途(元字符),如下:
[ ] \ ^ $ . | ? * + ( )
如果要在正则表达式中将这些字符用作文本字符,需要用反斜杠 "\"来转义。如, '1+2=3',则应使用如下正则表达式:
/1\+1=3/
使用连字符 ” - ” 定义一个字符范围作为字符集:
/[0-9]/
/[0-9a-fA-F]/ : 匹配0到9的一个数字或者a到f的字母又或者A到F的字母。
/[^0-9]/ : 我们还可以在" [ " 后跟一个 " ^ " ,来对字符集取反。
1.3 字符集:是由一对方括号[]括起来的字符集合。使用字符集,可以告诉正则表达式引擎仅仅匹配方括号里面的多个字符中的一个。
/[mo]/ 仅仅匹配字符串'm'或'o'。
要注意,字符集中的顺序不会影响匹配的结果。
' ^ ' 表示去反, /[^0-9]/ 匹配一个非数字。
2. 重复与限定
正则表达式对于重复出现的字符串可以使用限定符?、*、+来匹配。规则如下:
? 匹配前导字符0次或1次,即表示前导字符是可选的。
/love?mo/ 表示e 0次或1次
* 匹配前导字符0次或多次。
/love*mo/ 表示e 0次或多次
+ 匹配前导字符1次或多次
/love*mo/ 表示e 1次或多次
{ } 正则表达式的规则还允许我们使用一对限定符,
格式如下: {min,max}
其中,min,max都是非负数,表示重复的次数在min和max之间,即至少重复min次,最多重复max次,如果没有max,表示重复的次数没有上限,即至少重复min次。如果同时没有','和max,表示重复min次。
/love{1,3}mo/ 表示字母e至少重复1次,最多重复3次。
/love{1,}mo/ 表示字母e至少重复1次
/love{1}mo/ 表示字母e重复1次。
3. 贪婪匹配与懒惰匹配
Lin love<font>Mo</font>God bless them
/<.+>/
限定符'?'、'*'、'+'、'}'在匹配时具有贪婪性。原因在于'+'是贪婪的,'+'会导致正则表达式引擎试图尽可能多的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下,引擎才会进行回溯。也就是说,它会放弃最后一次的"重复",然后处理正则表达式剩余的部分。由于"+"的贪婪性,/<.+>/匹配的是<font>Mo</font>
为了能够成功匹配<font>,可以使用懒惰匹配来代替原来的贪婪匹配。只要在限定符后面紧接着一个问题"?",告诉正则表达式进行懒惰匹配就可以了。例如,/<.+?>/。
4. 开始与结束
它们不匹配任何字符,它们匹配的是字符之前或之后的位置。
" ^ " 是开始匹配符," ^ "匹配一行字符串第一个字符前面的位置,即字符串的开始
如: /^Lin/
" $ " 是结束匹配符," $ "匹配字符串最后一个字符后面的位置,即字符串的结束
如: /Mo$/
5. 模式修正符
一个标准的正则表达式由分隔符,表达式,修饰符3个组成。其中修饰符的作用是设置模式,即告诉正则引擎如何解释表达式。PHP中常用的模式修饰符如下:
i 忽略大小写
m 多文本模式,行起始符"^"和行结束符"$"除了匹配整个字符串的开头和结束外,还匹配其中的换行符
s 单文本模式,换行符当普通字符对待,符号" . "可以匹配包括换行符在内的任何符号
x 忽略空白字符
具体使用:
修饰符可以放在表达式的外面,如:
/Lin love Mo/I
也可以放在表达式里面,如:
(? 模式修饰符) 这个表示开启对应模式
(?-模式修饰符) 这个表示关闭对应模式
/(?i)Lin love (?-i)Mo/ 表示忽略’ Lin love’的大小写,而对’Mo’大小写敏感。