php正则表达式由于兼容了perl正则表达式,比js的正则表达式内容要丰富一些,用起来也很方便。
1在使用s这个模式修饰符时,.标识任意字符,包括回车、换行。
2使用u这个模式修饰符时,可以对正则表达式进行正则匹配。
3在适当的时候记得使用非贪婪模式,如(.*?)这样正则表达式写起来会方便一点。
4在js中动态构造正则表达式对象regexp时,其中的正则表达式主要要进行转义,如对于“\s”,在构建的时候需要使用“\\s”,需要进行转义,否则就有问题了。
5默认情况下,正则表达式结果数组的第一个值,如$match[0]标识完整匹配,使用PREG_SET_ORDER这个预定义常量可以对结果排序使得$matches[0]为第一组匹配结果的数组,$matches[1]为第二组匹配结果的数组,等等。不过,该标记仅用于preg_match_all()。
\
有数种用途的通用转义符
^
断言目标的开头(或在多行模式下行的开头,即紧随一换行符之后)
$
断言目标的结尾(或在多行模式下行的结尾,即紧随一换行符之前)
.
匹配除了换行符外的任意一个字符(默认情况下)
[
字符类定义开始
]
字符类定义结束
|
开始一个多选一的分支
(
子模式开始
)
子模式结束
?
扩展(的含义,也是0或1数量限定符,以及数量限定符最小值
*
匹配0个或多个的数量限定符
+
匹配1个或多个的数量限定符
{
最少/最多数量限定开始
}
最少/最多数量限定结束
模式中方括号内的部分称为“字符类”。字符类中可用的元字符为:
-
指出字符范围
]
结束字符类
\d
任一十进制数字
\D
任一非十进制数的字符
\s
任一空白字符
\S
任一非空白字符
\w
任一“字”的字符
\W
任一“非字”的字符
\b
字分界线
\B
非字分界线
\A
目标的开头(独立于多行模式)
\Z
目标的结尾或位于结尾的换行符前(独立于多行模式)
\z
目标的结尾(独立于多行模式)
\G
目标中的第一个匹配位置
表格1.PREG常量常量说明PREG_PATTERN_ORDER对结果排序使得$matches[0]为整个模式的匹配结果的数组,$matches[1]为第一个括号内的子模式所匹配的字符串的数组,等等。本标记仅用于preg_match_all()。PREG_SET_ORDER对结果排序使得$matches[0]为第一组匹配结果的数组,$matches[1]为第二组匹配结果的数组,等等。本标记仅用于preg_match_all()。PREG_OFFSET_CAPTURE见PREG_SPLIT_OFFSET_CAPTURE的说明。本标记自PHP4.3.0起可用。PREG_SPLIT_NO_EMPTY本标记使preg_split()仅返回非空的结果。PREG_SPLIT_DELIM_CAPTURE本标记使preg_split()也捕获定界符模式中的括号表达。本标记自PHP4.0.5起可用。PREG_SPLIT_OFFSET_CAPTURE如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其偏移量。本标记自PHP4.3.0起可用且仅用于preg_split()。
i(PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。
m(PCRE_MULTILINE)
默认情况下,PCRE将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了D修正符)。这和Perl是一样的。
当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和Perl的/m修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有^或$,则设定此修正符没有任何效果。
s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和Perl的/s修正符是等效的。排除字符类例如[^a]总是匹配换行符的,无论是否设定了此修正符。
x(PCRE_EXTENDED)
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的#以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和Perl的/x修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列(?(中间。
e
如果设定了此修正符,preg_replace()在替换字符串中对逆向引用作正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串。
只有preg_replace()使用此修正符,其它PCRE函数将忽略之。
A(PCRE_ANCHORED)
如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在Perl中实现的唯一方法)。
D(PCRE_DOLLAR_ENDONLY)
如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了m修正符则忽略此选项。Perl中没有与其等价的修正符。
S
当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的non-anchored模式有用。
U(PCRE_UNGREEDY)
本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和Perl不兼容。也可以通过在模式之中设定(?U)修正符或者在数量符之后跟一个问号(如.*?)来启用此选项。
X(PCRE_EXTRA)
此修正符启用了一个PCRE中与Perl不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和Perl一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。
u(PCRE_UTF8)
0 评论:
发表评论