正则表达式允许用户通过使用某种特殊字符构建匹配模式,然后把匹配模式与文件中的数据、程序输入或者Web页面的表单输入等目标对象进行比较,根据这些输入中是否包含匹配模式,来执行相应的程序。

目前有两种不同规范的正则表达式:

  • POSIX规范:在兼容 POSIX 的 UNIX 系统上,grep 和 egrep 之类的工具都遵循 POSIX 规范,一些数据库系统中的正则表达式也匹配 POSIX 规范。
  • PCRE 规范:为 Perl Compatible Regular Expressions 的缩写,中文即 Perl 兼容正则表达式,由 Philip Hazel 开发的 Perl 库,为很多现代工具所使用,大多数编程语言的正则表达式也都是集成该规范。

针对两种不同的正则表达式规范,PHP 提供了两组不同的函数库,分别为 POSIX Regex扩展库
PCRE扩展库,每个库对应特定的表达式。

从PHP5.3.0开始,POSIX Regex 扩展将被废弃,所有调用本扩展中函数都将提示 E_DEPRECATED 错误

下面就对 PCRE 正则语法进行学习

PCRE 正则语法

分隔符

当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。分隔符可以使任意非字母数字、非反斜线、非空白字符。
经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)。

1
2
3
4
/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%

如果分隔符需要在模式内进行匹配,它必须使用反斜线进行转义。

原子

原子是正则表达式的最基本的组成单位,而且必须至少包含一个原子。常见的有:

1
2
3
4
5
6
7
8
.   匹配除「\r」「\n」之外的任何单个字符
\d 匹配任意一个十进制数字
\D 匹配任意一个非十进制字符
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。注意Unicode正则表达式会匹配全角空格符。
\S 匹配任何非空白字符
\w 匹配包括下划线的任何单词字符。等价于「[A-Za-z0-9_]」,注意Unicode正则表达式会匹配中文字符
\W 匹配任何非单词字符。等价于「[^A-Za-z0-9_]」
[^] 作为一个原子,不能匹配[]之间的一个原子

元字符

元字符用来修饰原子的字符,不可以单独出现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//量词 
{n} n是一个非负整数。匹配原子n次
{n,} 至少匹配原子n次
{n,m} 其中n<=m。最少匹配n次且最多匹配m次。
* :匹配其左边的子表达式0次或多次
+ :匹配其左边的子表达式1次或多次
? :匹配其左边的子表达式0次或1次

//边界限制
^ :匹配指定字符串开头的字符串
$ :匹配指定字符串结尾的字符串

//模式选择符
[] :匹配指定范围内的单个字符,代替指定字符
| :在多项之间选择一个进行匹配

//模式单元
() :标记子表达式的开始和结束位置

模式修正符

1
2
3
4
5
6
i 大小写不敏感匹配。
m 支持多行匹配
s 模式中的点号元字符匹配所有字符,包含换行符
x 模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略
U 匹配模式变为懒惰模式
e PHP 5.5.0 移除,preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式)

PCRE函数

1
2
3
4
5
6
7
8
9
10
preg_filter — 执行一个正则表达式搜索和替换
preg_grep — 返回匹配模式的数组条目
preg_last_error — 返回最后一个PCRE正则执行产生的错误代码
preg_match_all — 执行一个全局正则表达式匹配
preg_match — 执行匹配正则表达式
preg_quote — 转义正则表达式字符
preg_replace_callback_array — Perform a regular expression search and replace using callbacks
preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace — 执行一个正则表达式的搜索和替换
preg_split — 通过一个正则表达式分隔字符串

常用正则表达式

参考文章:
PHP 正则表达式
正则表达式