PHP - 正则表达式


正则表达式本身只不过是字符的序列或模式。它们为模式匹配功能提供了基础。

使用正则表达式,您可以在另一个字符串中搜索特定字符串,可以将一个字符串替换为另一个字符串,并且可以将一个字符串拆分为多个块。

PHP 提供了特定于两组正则表达式函数的函数,每组对应于某种类型的正则表达式。您可以根据自己的舒适度使用它们中的任何一个。

  • POSIX 正则表达式
  • PERL 模式正则表达式

POSIX 正则表达式

POSIX 正则表达式的结构与典型的算术表达式的结构没有什么不同:各种元素(运算符)组合在一起以形成更复杂的表达式。

最简单的正则表达式是匹配字符串(如 ghagglebag)内的单个字符(如 g)的正则表达式。

让我们解释一下 POSIX 正则表达式中使用的几个概念。之后我们将为您介绍正则表达式相关的函数。

方括号 ([])

方括号 ([]) 在正则表达式的上下文中使用时具有特殊含义。它们用于查找一系列字符。

表达 描述
[0-9] 匹配 0 到 9 之间的任何十进制数字。
[a-z] 匹配从小写 a 到小写 z 的任何字符。
[A-Z] 匹配从大写 A 到大写 Z 的任何字符。
[a-Z] 匹配从小写 a 到大写 Z 的任何字符。

上面显示的范围是通用的;您还可以使用范围 [0-3] 来匹配 0 到 3 之间的任何十进制数字,或者使用范围 [b-v] 来匹配 bv 之间的任何小写字符。

量词

括号中的字符序列和单个字符的频率或位置可以用特殊字符表示。每个特殊字符都有特定的含义。+、*、?、{int. range} $ 标志都遵循字符序列。

表达式 描述
p+ 匹配包含至少一个 p 的任何字符串。
p* 匹配包含零个或多个 p 的任何字符串。
p? 匹配任何包含零个或一个 p 的字符串。
p{N} 匹配任何包含 N 个 p 序列的字符串
p{2,3} 匹配任何包含两个或三个 p 序列的字符串。
p{2, } 匹配包含至少两个 p 的序列的任何字符串。
p$ 匹配末尾带有 p 的任何字符串。
^p 匹配任何开头带有 p 的字符串。

例子

以下示例将阐明有关匹配字符的概念。

表达式 描述
[^a-zA-Z] 匹配不包含从 a 到 z 和 A 到 Z 的任何字符的任何字符串。
p.p 匹配任何包含 p、后跟任何字符、然后是另一个 p 的字符串。
^.{2}$ 匹配任何恰好包含两个字符的字符串。
<b>(.*)</b> 匹配 <b> 和 </b> 中包含的任何字符串。
p(hp)* 匹配任何包含 p 后跟序列 php 的零个或多个实例的字符串。

预定义字符范围

为了便于编程,可以使用几个预定义的字符范围(也称为字符类)。字符类指定整个字符范围,例如,字母表或整数集 -

表达式 描述
[[:alpha:]] 匹配包含字母字符 aA 到 zZ 的任何字符串。
[[:digit:]] 匹配任何包含数字 0 到 9 的字符串。
[[:alnum:]] 匹配包含字母数字字符 aA 到 zZ 和 0 到 9 的任何字符串。
[[:space:]] 匹配任何包含空格的字符串。

PHP  正则 POSIX 函数

PHP 目前提供了 7 个函数,用于使用 POSIX 模式的正则表达式搜索字符串 -

函数 描述
ereg() 在 string 指定字符串中搜索 pattern 指定字符串,如果找到 pattern ,则返回 true,否则返回 false。区分大小写。
ereg_replace() 搜索 pattern 指定字符串,如果找到,则替换 pattern。区分大小写
eregi() 在 string 指定字符串中搜索 pattern 指定字符串,如果找到 pattern ,则返回 true,否则返回 false。不区分大小写。
eregi_replace() 搜索 pattern 指定字符串,如果找到,则替换 pattern。不区分大小写。
split() 将字符串分割成各种元素,每个元素边界基于字符串中出现的 pattern 。区分大小写。
spliti() 将字符串分割成各种元素,每个元素边界基于字符串中出现的 pattern 。不区分大小写。
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 的正则表达式搜索字符串 -

函数 描述
preg_match() preg_match() 函数在字符串中搜索 pattern,如果存在 pattern 则返回 true,否则返回 false。
preg_match_all() preg_match_all() 函数匹配字符串中出现的所有 pattern。
preg_replace() preg_replace() 函数的工作方式与 ereg_replace() 类似,不同之处在于正则表达式可以在 pattern 和 replacement 输入参数中使用。
preg_split() preg_split() 函数的操作与 split() 完全相同,不同之处在于正则表达式被接受为 pattern 的输入参数。
preg_grep() preg_grep() 函数搜索 input_array 的所有元素,返回与 regexp 模式匹配的所有元素。
preg_ quote() 引用正则表达式字符