PHP - 正则表达式
正则表达式本身就是一个字符序列或模式。它们为模式匹配功能提供了基础。
使用正则表达式,你可以在一个字符串中搜索特定的字符串,你可以将一个字符串替换为另一个字符串,还可以将一个字符串拆分成多个片段。
PHP 提供了两组特定的正则表达式函数,每组对应一种类型的正则表达式。你可以根据自己的喜好使用其中任何一组。
- POSIX 正则表达式
- PERL 风格正则表达式
POSIX 正则表达式
POSIX 正则表达式的结构与典型的算术表达式并无太大不同:各种元素(运算符)组合形成更复杂的表达式。
最简单的正则表达式是匹配单个字符的表达式,例如在字符串 g、haggle 或 bag 中匹配 g。
下面我们先解释 POSIX 正则表达式中使用的一些概念,然后再介绍相关的函数。
方括号
方括号 ([]) 在正则表达式的上下文中具有特殊含义。它们用于查找字符范围。
| 序号 | 表达式 & 描述 |
|---|---|
| 1 | [0-9] 匹配 0 到 9 的任意十进制数字。 |
| 2 | [a-z] 匹配小写字母 a 到 z 中的任意字符。 |
| 3 | [A-Z] 匹配大写字母 A 到 Z 中的任意字符。 |
| 4 | [a-Z] 匹配从小写 a 到大写 Z 的任意字符。 |
上面的范围是通用的;你也可以使用 [0-3] 来匹配 0 到 3 的任意十进制数字,或使用 [b-v] 来匹配小写字母 b 到 v 的任意字符。
量词
方括号中的字符序列和单个字符的频率或位置可以用特殊字符表示。每个特殊字符都有特定的含义。+、*、?、{int, range} 和 $ 等标志都跟在字符序列后面。
| 序号 | 表达式 & 描述 |
|---|---|
| 1 | p+ 匹配包含至少一个 p 的任意字符串。 |
| 2 | p* 匹配包含零个或多个 p 的任意字符串。 |
| 3 | p? 匹配包含零个或一个 p 的任意字符串。 |
| 4 | p{N} 匹配包含 N 个 p 的序列的任意字符串。 |
| 5 | p{2,3} 匹配包含两个或三个 p 的序列的任意字符串。 |
| 6 | p{2, } 匹配包含至少两个 p 的序列的任意字符串。 |
| 7 | p$ 匹配以 p 结尾的任意字符串。 |
| 8 | ^p 匹配以 p 开头的任意字符串。 |
示例
以下示例将帮助你理解字符匹配的概念。
| 序号 | 表达式 & 描述 |
|---|---|
| 1 | [^a-zA-Z] 匹配不包含 a 到 z 和 A 到 Z 中任意字符的字符串。 |
| 2 | p.p 匹配包含 p,后跟任意字符,再后跟另一个 p 的任意字符串。 |
| 3 | ^.{2}$ 匹配恰好包含两个字符的任意字符串。 |
| 4 | <b>(.*)</b> 匹配被 <b> 和 </b> 包围的任意字符串。 |
| 5 | p(hp)* 匹配包含一个 p,后跟零个或多个 php 序列的任意字符串。 |
预定义字符范围
为了编程方便,提供了一些预定义的字符范围,也称为字符类。字符类指定了整个字符范围,例如字母表或整数集 −
| 序号 | 表达式 & 描述 |
|---|---|
| 1 | [[:alpha:]] 匹配包含字母字符 aA 到 zZ 的任意字符串。 |
| 2 | [[:digit:]] 匹配包含数字 0 到 9 的任意字符串。 |
| 3 | [[:alnum:]] 匹配包含字母数字字符 aA 到 zZ 和 0 到 9 的任意字符串。 |
| 4 | [[:space:]] 匹配包含空格的任意字符串。 |
PHP 的 Regexp POSIX 函数
PHP 当前提供了七个用于使用 POSIX 风格正则表达式搜索字符串的函数 −
| 序号 | 函数 & 描述 |
|---|---|
| 1 | ereg()
ereg() 函数在由 string 指定的字符串中搜索由 pattern 指定的字符串,如果找到 pattern 则返回 true,否则返回 false。 |
| 2 | ereg_replace()
ereg_replace() 函数搜索由 pattern 指定的字符串,如果找到则用 replacement 替换 pattern。 |
| 3 | eregi()
eregi() 函数在由 pattern 指定的字符串中搜索由 string 指定的字符串。搜索不区分大小写。 |
| 4 | eregi_replace()
eregi_replace() 函数的工作方式与 ereg_replace() 完全相同,只是它在 string 中搜索 pattern 时不区分大小写。 |
| 5 | split()
split() 函数会将字符串分割成各种元素,每个元素的边界基于 string 中 pattern 的出现位置。 |
| 6 | spliti()
spliti() 函数的工作方式与其兄弟函数 split() 完全相同,只是它不区分大小写。 |
| 7 | sql_regcase()
sql_regcase() 函数可以被视为一个实用函数,它将输入参数字符串中的每个字符转换为包含两个字符的括号表达式。 |
PERL 风格正则表达式
Perl 风格正则表达式与其 POSIX 对应物类似。POSIX 语法几乎可以与 Perl 风格正则表达式函数互换使用。事实上,你可以使用前面的 POSIX 部分介绍的任何量词。
让我们解释一下 PERL 正则表达式中使用的几个概念。之后我们将介绍与正则表达式相关的函数。
元字符
元字符就是一个前面加反斜杠的字母字符,这种组合具有特殊含义。
例如,你可以使用 '\d' 元字符搜索大额货币: /([\d]+)000/,这里 \d 将搜索任何数字字符字符串。
以下是在 PERL 风格正则表达式中可以使用元字符列表。
字符 描述 . 单个字符 \s 空白字符(空格、制表符、换行符) \S 非空白字符 \d 数字(0-9) \D 非数字 \w 单词字符(a-z, A-Z, 0-9, _) \W 非单词字符 [aeiou] 匹配给定集合中的单个字符 [^aeiou] 匹配给定集合外的单个字符 (foo|bar|baz) 匹配指定的任何备选项
修饰符
有几种修饰符可用,可以让你的正则表达式工作更加容易,例如大小写敏感性、多行搜索等。
修饰符 描述 i 使匹配不区分大小写 m 指定如果字符串包含换行符或回车符,则 ^ 和 $ 操作符将匹配换行边界,而不是字符串边界 o 仅评估一次表达式 s 允许 . 匹配换行字符 x 允许在表达式中使用空白字符以提高清晰度 g 全局查找所有匹配 cg 允许在全局匹配失败后继续搜索
PHP 的 PERL 兼容正则表达式函数
PHP 提供了以下函数,用于使用 Perl 兼容的正则表达式搜索字符串 −
| 序号 | 函数 & 描述 |
|---|---|
| 1 | preg_match()
preg_match() 函数在字符串中搜索 pattern,如果 pattern 存在则返回 true,否则返回 false。 |
| 2 | preg_match_all()
preg_match_all() 函数匹配字符串中 pattern 的所有出现位置。 |
| 3 | preg_replace()
preg_replace() 函数的操作类似于 ereg_replace(),但 pattern 和 replacement 输入参数可以使用正则表达式。 |
| 4 | preg_split()
preg_split() 函数的操作完全类似于 split(),但接受正则表达式作为 pattern 的输入参数。 |
| 5 | preg_grep()
preg_grep() 函数搜索 input_array 的所有元素,返回匹配 regexp pattern 的所有元素。 |
| 6 | preg_quote()
转义正则表达式字符 |