PHP 正则表达式

2024 年 8 月 29 日 | 阅读 6 分钟

正则表达式通常被称为 regex。它们不过是一个模式或一系列字符,用于描述文本字符串中的特殊搜索模式。

正则表达式允许你在另一个字符串中搜索特定的字符串。我们甚至可以将一个字符串替换为另一个字符串,还可以将一个字符串拆分成多个块。它们使用算术运算符(+、-、^)来创建复杂的表达式。

默认情况下,正则表达式是区分大小写的

正则表达式的优势和用途

正则表达式几乎在当前应用程序编程的每个地方都有使用。下面列出了一些正则表达式的优势和用途。

  1. 正则表达式帮助程序员验证文本字符串。
  2. 它提供了一个强大的工具来分析和搜索模式,以及修改文本字符串。
  3. 通过使用 regex 函数,可以为识别模式提供简单易行的解决方案。
  4. Regexes 有助于创建识别标签的 HTML 模板系统。
  5. Regexes 广泛用于浏览器检测、表单验证、垃圾邮件过滤和密码强度检查。
  6. 它有助于用户输入验证测试,例如电子邮件地址、手机号码和 IP 地址。
  7. 它有助于根据搜索结果或输入突出显示文件中的特殊关键字。
  8. 元字符允许我们创建更复杂的模式。

你可以通过应用正则表达式的一些基本规则来创建复杂的搜索模式。许多算术运算符(+、-、^)也由正则表达式使用来创建复杂的模式。

正则表达式中的运算符

运算符描述
^它表示字符串的开头。
$它表示字符串的结尾。
.它代表任何单个字符。
()它表示一组表达式。
[]它查找字符范围,例如,[abc] 表示 a、b 或 c。
[^]它查找不在范围内的字符,例如,[^xyz] 表示非 x、y 或 z。
-它查找元素之间的范围,例如,[a-z] 表示从 a 到 z。
|它是一个逻辑 OR 运算符,用于元素之间。例如,a|b,表示 a 或 b。
?它表示前面字符或元素范围的零次或一次出现。
*它表示前面字符或元素范围的零次或多次出现。
+它表示前面字符或元素范围的零次或多次出现。
{n}它表示前面字符范围至少出现 n 次。例如 - n{3}
{n, }它表示至少出现 n 次,但不超过 m 次,例如,n{2,5} 表示 n 出现 2 到 5 次。
{n, m}它表示至少出现 n 次,但不超过 m 次。例如 - n{3,6} 表示 n 出现 3 到 6 次。
\它表示转义字符。

正则表达式中的特殊字符类

特殊字符描述
\n它表示新行。
\r它表示回车符。
\t它表示制表符。
\v它表示垂直制表符。
\f它表示换页符。
\xxx它表示一个八进制字符。
\xxh它表示十六进制字符 hh。

PHP 提供了两套正则表达式函数

  1. POSIX 正则表达式
  2. PERL 风格正则表达式

POSIX 正则表达式

POSIX 正则表达式的结构类似于典型的算术表达式:几个运算符/元素组合在一起形成更复杂的表达式。

最简单的正则表达式是匹配字符串中单个字符的正则表达式。例如 - "g" 在 toggle 或 cage 字符串中。让我们介绍一些在 POSIX 正则表达式中使用到的概念。

方括号

在正则表达式中使用方括号 [] 时它们有特殊含义。它们用于查找其中的字符范围。

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

上述范围是常用的。你可以根据需要使用范围值,例如 [0-6] 匹配从 0 到 6 的任何十进制数字。

量词

特殊字符可以表示方括号字符序列和单个字符的位置。每个特殊字符都有特定的含义。给出的符号 +, *, ?, $, 和 {int range} 标志都遵循字符序列。

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

PHP Regexp POSIX 函数

PHP 提供了七个函数来使用 POSIX 风格的正则表达式搜索字符串:

函数描述
ereg()它在一个字符串中搜索一个模式,如果找到匹配项则返回 true,否则返回 false。
ereg_replace()它在一个字符串中搜索一个模式,并将匹配的文本替换为替换字符串。
eregi()它在一个字符串中搜索一个模式,如果找到则返回匹配字符串的长度,否则返回 false。这是一个不区分大小写的函数。
eregi_replace()此函数与 ereg_replace() 函数的工作方式相同。唯一的区别是此函数的模式搜索不区分大小写。
split()split() 函数将字符串分割成数组。
spliti()它与 split() 函数类似,因为它也通过正则表达式将字符串分割成数组。
Sql_regcase()它创建一个用于不区分大小写匹配的正则表达式,并返回一个将匹配字符串的有效正则表达式。

注意:请注意,上述函数在 PHP 5.3.0 中已被弃用,并在 PHP 7.0.0 中被移除。

PERL 风格正则表达式

Perl 风格的正则表达式与 POSIX 非常相似。POSIX 语法可以与 Perl 风格的正则表达式函数互换使用。POSIX 部分引入的量词也可以在 PERL 风格的正则表达式中使用。

元字符

元字符是后跟反斜杠的字母字符,它赋予该组合特殊的含义。

例如 - '\d' 元字符可用于搜索大笔金额:/([\d]+)000/。这里 /d 将搜索数字字符的字符串。

下面是可以用于 PERL 风格正则表达式的元字符列表:

Character描述
.匹配单个字符
\s它匹配空格字符,如空格、换行符、制表符。
\S非空白字符
\d它匹配 0 到 9 的任何数字。
\D匹配非数字字符。
\w匹配单词字符,如 - a-z、A-Z、0-9、_
\W匹配非单词字符。
[aeiou]它匹配给定集合中的任何单个字符。
[^aeiou]它匹配给定集合以外的任何单个字符。
(foo|baz|bar)匹配指定选项中的任何一个。

修饰符

有几种修饰符可用,它们使正则表达式的工作更加轻松。例如 - 区分大小写或在多行中搜索等。

下面是 PERL 风格正则表达式中使用的修饰符列表:

Character描述
i使搜索不区分大小写
m它指定如果字符串包含回车符或换行符,则 $ 和 ^ 运算符将匹配换行边界而不是字符串边界。
o仅评估一次表达式
s它允许使用 .(点) 来匹配换行符。
x此修饰符允许我们在表达式中使用空格以提高清晰度。
g它全局搜索所有匹配项。
cg它允许搜索在全局匹配失败后继续进行。

PHP Regexp POSIX 函数

PHP 目前提供七个函数来使用 POSIX 风格的正则表达式搜索字符串:

函数描述
preg_match()此函数在字符串中搜索模式,如果模式存在则返回true,否则返回false
preg_match_all()此函数匹配字符串中模式的所有出现。
preg_replace()preg_replace() 函数类似于 ereg_replace() 函数,除了正则表达式可以用于搜索和替换。
preg_split()此函数的工作方式与 split() 函数完全相同,除了它接受正则表达式作为模式的输入参数。主要它通过正则表达式分割字符串。
preg_grep()preg_grep() 函数查找 input_array 的所有元素,并返回与 regexp(关系表达式)模式匹配的数组元素。
preg_quote()引用正则表达式字符。