PHP 正则表达式

什么是正则表达式?

正则表达式是由字符组成的搜索模式。当您在文本中搜索数据时,可以使用此搜索模式来描述您要查找的内容。

正则表达式可以是一个单个字符,也可以是一个更复杂的模式。

正则表达式可用于执行各种类型的文本搜索和文本替换操作。

语法

在 PHP 中,正则表达式是由分隔符、模式和可选修饰符组成的字符串。

$exp = "/w3school/i";

在上面的例子中,/分隔符w3school 是要搜索的模式i 是一个修饰符,它使搜索不区分大小写。

分隔符可以是任何非字母、非数字、非反斜杠和非空格的字符。最常见的分隔符是正斜杠(/),但当您的模式包含正斜杠时,选择其他分隔符(如 # 或 ~)会更方便。

正则表达式函数

PHP 提供了多种允许您使用正则表达式的函数。

最常见的函数包括:

函数 描述
preg_match() 如果字符串中存在与模式匹配的项,则返回 1,否则返回 0。
preg_match_all() 返回字符串中与模式匹配的项的次数,次数也可能是 0。
preg_replace() 返回新字符串,其中匹配的模式已被另一个字符串替换。

使用 preg_match()

preg_match() 函数将告诉您字符串中是否包含与模式匹配的项。

实例

使用正则表达式在字符串中执行不区分大小写的搜索以查找 "w3school":

$str = "Visit W3School";
$pattern = "/w3school/i";
echo preg_match($pattern, $str);

亲自试一试

使用 preg_match_all()

preg_match_all() 函数将告诉您字符串中与模式匹配的项的数量。

实例

使用正则表达式在字符串中执行不区分大小写的搜索,以计算 "ain" 出现的次数:

$str = "The rain in SPAIN falls mainly on the plains.";
$pattern = "/ain/i";
echo preg_match_all($pattern, $str);

亲自试一试

使用 preg_replace()

preg_replace() 函数将字符串中与模式匹配的所有项替换为另一个字符串。

实例

使用不区分大小写的正则表达式将字符串中的 "Microsoft" 替换为 "W3School":

$str = "Visit Microsoft!";
$pattern = "/microsoft/i";
echo preg_replace($pattern, "W3School", $str);

亲自试一试

正则表达式修饰符

修饰符可以改变搜索的执行方式。

修饰符 描述 试一试
i 执行不区分大小写的搜索。 试一试
m 执行多行搜索(在字符串的开头或结尾搜索匹配项的模式现在将匹配每行的开头或结尾)。 试一试
u 启用 UTF-8 编码模式的正确匹配。

正则表达式模式

使用方括号来查找一系列字符:

表达式 描述 试一试
[abc] 查找方括号内的一个或多个字符。 试一试
[^abc] 查找不在方括号内的任何字符。 试一试
[a-z] 查找两个字母之间的任何字母字符。 试一试
[A-z] 查找指定大写字母和指定小写字母之间的任何字符。 试一试
[A-Z] 查找两个大写字母之间的任何字符。 试一试
[123] 查找方括号内的一个或多个数字。 试一试
[0-5] 查找两个数字之间的任何数字。 试一试
[0-9] 查找任何数字。 试一试

元字符

元字符是具有特殊含义的字符:

元字符 描述 试一试
| 查找由 | 分隔的任何模式之一,如:cat|dog|fish。 试一试
. 查找任何字符。 试一试
^ 查找作为字符串开头的匹配项,如:^Hello。 试一试
$ 查找作为字符串结尾的匹配项,如:World$。 试一试
\d 查找任何数字。 试一试
\D 查找任何非数字。 试一试
\s 查找任何空白字符。 试一试
\S 查找任何非空白字符。 试一试
\w 查找任何字母(a 到 Z)和数字(0 到 9)。 试一试
\W 查找任何非字母和非数字字符。 试一试
\b 查找位于单词开头或结尾的匹配项,如:\bWORD 或 WORD\b。 试一试
\uxxxx 查找由十六进制数 xxxx 指定的 Unicode 字符。 试一试

量词

量词定义数量:

量词 描述 试一试
n+ 匹配包含至少一个 n 的任何字符串。 试一试
n* 匹配包含零个或多个 n 的任何字符串。
n? 匹配包含零个或一个 n 的任何字符串。
n{3} 匹配包含三个 n 的序列的任何字符串。 试一试
n{2, 5} 匹配包含至少 2 个但不超过 5 个 n 的序列的任何字符串。 试一试
n{3,} 匹配包含至少 3 个 n 的序列的任何字符串。 试一试

注意:如果您的表达式需要搜索特殊字符之一,您可以使用反斜杠(\)来转义它们。例如,要搜索一个或多个问号,您可以使用以下表达式:$pattern = '/\?+/';。

分组

您可以使用括号 ( ) 将量词应用于整个模式。它们还可以用于选择模式的一部分作为匹配项。

实例

使用分组通过查找 ba 后跟两个 na 实例来搜索单词 "banana":

$str = "Apples and bananas.";
$pattern = "/ba(na){2}/i";
echo preg_match($pattern, $str);

亲自试一试

完整的 RegExp 参考手册

如需完整参考,请转到我们的完整 PHP 正则表达式参考手册

该参考包含所有正则表达式函数的描述和实例。