正则表达式
| 原子\元字符 | 含义描述 |
|---|---|
^或\A |
匹配输入字符串的开始位置(或在多行模式\n、\r之后的位置) |
$或\Z |
匹配输入字符串的结束位置(或在多行模式\n、\r之前的位置) |
\ |
转义字符或一个向后引用 |
* |
匹配0次、1次或多次其前的原子。例如,zo*能匹配z以及zoo。*等价于{0,} |
+ |
匹配1次或多次其前的原子。例如,zo+能匹配zo以及zoo,但不能匹配z。+等价于{1,} |
? |
匹配0次或1次其前的原子。例如,do(es)?可以匹配does或do。?等价于{0,1} |
? |
当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串oooo,o+?将匹配单个o,而o+将匹配oooo |
. |
匹配除了换行符\n外的任意一个字符 |
x|y |
匹配两个或多个分支选择,即匹配x或者匹配y |
{n} |
表示其前的原子恰好出现n次 |
{n,} |
表示其前的原子出现不少于n次 |
{n,m} |
表示其前的原子出现n到m次 |
[xyz] |
匹配方括号中指定的任意一个原子,即匹配x、y或z |
[^xyz] |
匹配除方括号中的原子以外的任意一个字符,即匹配除了x、y和z外的任意字符 |
[a-z] |
匹配a到z范围内的任意小写字母字符 |
[^a-z] |
匹配a到z范围外的任意字符 |
() |
匹配其整体为一个原子,即模式单元,并获取这一匹配,可以通过\进行引用。 |
(?:pattern) |
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符(|)来组合一个模式的各个部分是很有用。例如industr(?:y|ies)就是一个比industry|industries更简略的表达式 |
(?=pattern) |
正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,Windows(?=95|98|NT|2000)能匹配Windows2000中的Windows,但不能匹配Windows3.1中的Windows。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?!pattern) |
正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如Windows(?!95|98|NT|2000)能匹配Windows3.1中的Windows,但不能匹配Windows2000中的Windows。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?<=pattern) |
反向肯定预查,与正向肯定预查类似,只是方向相反。例如,(?<=95|98|NT|2000)Windows能匹配2000Windows中的Windows,但不能匹配3.1Windows中的Windows |
(?<!pattern) |
反向否定预查,与正向否定预查类似,只是方向相反。例如(?<!95|98|NT|2000)Windows能匹配3.1Windows中的Windows,但不能匹配2000Windows中的Windows |
\b |
匹配一个单词边界,也就是指单词和空格间的位置。例如,er\b可以匹配never中的er,但不能匹配verb中的er |
\B |
匹配非单词边界。例如,er\B能匹配verb中的er,但不能匹配never中的er |
\d |
匹配任意一个十进制数字,等价于[0-9] |
\D |
匹配任意一个除十进制数字外的字符,等价于[^0-9] |
\s |
匹配任意一个空白字符,等价于[\f\n\r\t\v] |
\S |
匹配任意一个除空白字符外的字符,等价于[^\f\n\r\t\v] |
\w |
匹配任意一个数字、字母或者下划线,等价于[0-9a-zA-Z_] |
\W |
匹配任意一个除数字、字母和下划线外的字符,等价于[^0-9a-zA-Z_] |
\cx |
匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的c字符 |
\f |
匹配一个换页符,等价于\x0c和\cL |
\n |
匹配一个换行符,等价于\x0a和\cJ |
\r |
匹配一个回车符,等价于\x0d和\cM |
\t |
匹配一个制表符,等价于\x09和\cI |
\v |
匹配一个垂直制表符,等价于\x0b和\cK |
| 模式修正符 | 功能描述 |
|---|---|
i |
模式中的字母会进行大小写不敏感匹配 |
m |
默认情况下,PCRE认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), “行首”元字符 (^) 仅匹配字符串的开始位置, 而”行末”元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了D修饰符)。这个行为和perl相同。 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于perl的/m修饰符。如果目标字符串中没有\n字符,或者模式中没有出现^或$,设置这个修饰符不产生任何影响 |
s |
如果设置了这个修饰符,模式中的点号元字符.匹配所有字符,包含换行符。即将字符串视为单行,换行符作为普通字符看待。如果没有这个修饰符,点号不匹配换行符。这个修饰符等同于perl中的/s修饰符。 一个取反字符类比如[^a]总是匹配换行符,而不依赖于这个修饰符的设置 |
x |
模式中的空白忽略不计,除非它已经被转义 |
e |
Warning:This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0. 所以不要轻易使用了,作用是:只用在preg_replace()函数中,在替换的字符串中对逆向引用做正常的替换,将其作为PHP代码求值,并用其结果替换所搜索的字符串 |
U |
这个修饰符逆转了量词的”贪婪”模式。使量词默认为非贪婪的,通过量词后紧跟?的方式可以使其成为贪婪的。这和perl是不兼容的。 |
D |
如果这个修饰符被设置,模式中的元字符美元符号$仅仅匹配目标字符串的末尾。如果这个修饰符没有设置,当字符串以一个换行符结尾时,美元符号$还会匹配该换行符(但不会匹配之前的任何换行符)。 如果设置了修饰符m,这个修饰符被忽略。在perl中没有与此修饰符等同的修饰符 |
其他的模式修正符号请参考: PHP手册-模式修饰符
常用正则表达式
可以参考下面的链接,是我搜索github上常用正则表达式汇总的repo,个别表达式可能存在问题,用前请谨慎验证:
PHP相关函数
在PHP中支持两套正则表达式处理函数库:
-
PCRE(Perl Compatible Regular Expression),与Perl语言兼容的正则表达式函数。以preg_为前缀命名的函数,而且表达式都应该被包含在定界符中,如斜线/。 -
POSIX(Portable Operation System Interface of UNIX)拓展语法的正则表达式函数。以ereg_为前缀命名的函数。与PCRE功能类似,但是执行效率不如PCRE。
| 函数名 | 功能描述 |
|---|---|
preg_match |
进行正则表达式匹配,返回0或1表示不匹配或匹配(匹配1次就停止搜索) |
preg_match_all |
进行全局正则表达式匹配,返回匹配次数 |
preg_replace |
执行正则表达式的搜索和替换 |
preg_split |
用正则表达式分割字符串 |
preg_grep |
返回与模式匹配的数组单元 |
preg_replace_callback |
用回调函数执行正则表达式的搜索和替换 |
更多请参考:PHP手册- PCRE函数
参考文献
《细说PHP》第九章 正则表达式