快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
grep
PowerGREP
RegexBuddy
RegexMagic
通用应用程序
EditPad Lite
EditPad Pro
语言和库
Boost
Delphi
GNU(Linux)
Groovy
Java
JavaScript
.NET
PCRE(C/C++)
PCRE2(C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
数据库
MySQL
Oracle
PostgreSQL
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS Feed 和博客
RegexBuddy—The best regex editor and tester for PHP developers!

PHP 提供三组正则表达式函数

PHP 是一种用于生成动态网页的开源语言。PHP 有三组函数,可让你使用 正则表达式

最重要的正则表达式函数组以 preg 开头。这些函数是对 PCRE 库(与 Perl 兼容的正则表达式) 的 PHP 封装。本网站上 正则表达式教程 中关于 PCRE 正则表达式风格的任何内容都适用于 PHP 的 preg 函数。当教程专门讨论 PHP 时,它假定你正在使用 preg 函数。对于所有使用正则表达式的 PHP 新代码,你都应使用 preg 函数。从 PHP 4.2.0(2002 年 4 月)开始,PHP 默认包含 PCRE。

最古老的正则表达式函数组是以 ereg 开头的那些函数。它们实现了 POSIX 扩展正则表达式,就像传统的 UNIX egrep 命令。这些函数主要用于与 PHP 3 向后兼容。从 PHP 5.3.0 开始,它们已正式弃用。许多较新的正则表达式功能(如 惰性量词环视Unicode)不受 ereg 函数支持。不要被“扩展”一词迷惑。POSIX 标准定义于 1986 年,自那时起正则表达式已经有了很大的发展。

最后一组是 ereg 组的一个变体,在函数名称前加上“多字节”的 mb_ 前缀。虽然 ereg 将正则表达式和主题字符串视为一系列 8 位字符,但 mb_ereg 可以处理来自各种代码页的多字节字符。如果您希望正则表达式将远东字符视为单个字符,则需要使用 mb_ereg 函数或带有 /u 修饰符的 preg 函数。mb_ereg 在 PHP 4.2.0 及更高版本中可用。它使用相同的 POSIX ERE 风格。

preg 函数组

所有 preg 函数都要求您使用 Perl 语法将正则表达式指定为字符串。在 Perl 中,/regex/ 定义正则表达式。在 PHP 中,这将变为 preg_match('/regex/', $subject)。当正斜杠用作正则表达式定界符时,正则表达式中的任何正斜杠都必须使用反斜杠进行转义。因此 https://www\.jgsoft\.com/ 变为 '/https:\/\/www\.jgsoft\.com\//'。与 Perl 一样,preg 函数允许任何非字母数字字符作为正则表达式定界符。使用百分号作为正则表达式定界符,URL 正则表达式将更具可读性,如 '%https://www\.jgsoft\.com/%',因为这样您无需转义正斜杠。如果正则表达式包含任何百分号,则必须转义百分号。

与 C# 或 Java 等编程语言不同,PHP 不要求转义字符串中的所有反斜杠。如果您希望在 PHP 字符串中将反斜杠包含为一个文本字符,则只有在反斜杠后跟需要转义的另一个字符时才需要转义它。在单引号字符串中,只有单引号和反斜杠本身需要转义。这就是为什么在上述正则表达式中,我不必在文本点前面加倍反斜杠的原因。与单个反斜杠匹配的正则表达式 \\ 将变为 PHP preg 字符串 '/\\\\/'。除非您希望在正则表达式中使用变量插值,否则您应该始终在 PHP 中为正则表达式使用单引号字符串,以避免反斜杠的混乱重复。

要指定正则表达式匹配选项(例如不区分大小写),其指定方式与 Perl 中相同。 '/regex/i' 以不区分大小写的方式应用正则表达式。 '/regex/s' 使 匹配所有字符。 '/regex/m' 使 行首和行尾锚定 在主题字符串的嵌入换行符处匹配。 '/regex/x' 启用 自由间距模式。您可以指定多个字母以启用多个选项。 '/regex/misx' 启用所有四个选项。

一个特殊选项是 /u,它启用 Unicode 匹配模式,而不是默认的 8 位匹配模式。您应该为使用 \x{FFFF}\X\p{L} 匹配 Unicode 字符、字素、属性或脚本的正则表达式指定 /u。PHP 会将 '/regex/u' 解释为 UTF-8 字符串,而不是 ASCII 字符串。

ereg 函数类似,bool preg_match (string pattern, string subject [, array groups]) 在正则表达式 pattern 匹配 subject 字符串或 subject 字符串的一部分时返回 TRUE。如果您指定第三个参数,preg 会将第一个 捕获组 匹配的子字符串存储在 $groups[1] 中。 $groups[2] 将包含第二对,依此类推。如果正则表达式 pattern 使用 命名捕获,您可以通过 $groups['name'] 按名称访问这些组。 $groups[0] 将保存整个匹配项。

int preg_match_all (string pattern, string subject, array matches, int flags) 使用 subject 字符串中正则表达式 pattern 的所有匹配项填充数组“matches”。如果您指定 PREG_SET_ORDER 作为标志,则 $matches[0] 是一个包含第一个匹配项的匹配项和反向引用的数组,就像 $groups 数组由 preg_match 填充一样。 $matches[1] 保存第二个匹配项的结果,依此类推。如果您指定 PREG_PATTERN_ORDER,则 $matches[0] 是一个包含完整连续正则表达式匹配项的数组,$matches[1] 是一个包含所有匹配项的第一个反向引用的数组,$matches[2] 是一个包含每个匹配项的第二个反向引用的数组,依此类推。

array preg_grep (string pattern, array subjects) 返回一个数组,其中包含数组“subjects”中所有可以由正则表达式 pattern 匹配的字符串。

mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit]) 返回一个字符串,其中 subject 字符串中 regex pattern 的所有匹配项都替换为 replacement 字符串。最多进行 limit 次替换。一个关键区别在于,除了 limit,所有参数都可以是数组,而不是字符串。在这种情况下,preg_replace 会多次执行其任务,同时迭代数组中的元素。您还可以对某些参数使用字符串,对其他参数使用数组。然后,该函数将迭代数组,并对每次迭代使用相同的字符串。使用 pattern 和 replacement 的数组,您可以对单个 subject 字符串执行一系列搜索和替换操作。对 subject 字符串使用数组,您可以对多个 subject 字符串执行相同的搜索和替换操作。

preg_replace_callback (mixed pattern, callback replacement, mixed subject [, int limit]) 的工作原理与 preg_replace 完全相同,只是第二个参数采用回调,而不是字符串或字符串数组。将对每个匹配项调用回调函数。回调应接受一个参数。此参数将是一个字符串数组,其中元素 0 保存整体 regex 匹配项,其他元素保存通过捕获组匹配的文本。这是您将从 preg_match 获得的相同数组。回调函数应返回匹配项应替换为的文本。返回一个空字符串以删除匹配项。返回 $groups[0] 以跳过此匹配项。

回调允许您执行仅使用正则表达式无法执行的强大的搜索和替换操作。例如,如果您搜索 regex (\d+)\+(\d+),则可以使用回调将 2+3 替换为 5

function regexadd($groups) {
  return $groups[1] + $groups[2];
}

array preg_split (string pattern, string subject [, int limit]) 的工作原理与 split 完全相同,只是它对 regex pattern 使用 Perl 语法。

有关 preg 函数集的更多信息,请参阅 PHP 手册

ereg 函数集

正如你所期望的,ereg 函数要求你将正则表达式指定为字符串。 ereg('regex', "subject") 检查 regex 是否与 subject 匹配。当将正则表达式作为文字字符串传递时,你应使用单引号。几个 特殊字符(如美元符号和反斜杠)在双引号 PHP 字符串中也是特殊字符,但在单引号 PHP 字符串中则不是。

int ereg (string pattern, string subject [, array groups]) 如果正则表达式模式与 subject 字符串或 subject 字符串的一部分匹配,则返回匹配的长度;否则返回零。由于零求值为 False,非零求值为 True,因此你可以在 if 语句中使用 ereg 来测试匹配。如果你指定第三个参数,ereg 将在 $groups[1] 中存储由 括号的第一对之间的正则表达式部分匹配的子字符串。 $groups[2] 将包含第二对,依此类推。请注意,ereg 不支持仅分组的括号。 ereg 区分大小写。 eregi 是不区分大小写的等效项。

string ereg_replace (string pattern, string replacement, string subject) 用替换字符串替换 subject 字符串中 regex 模式的所有匹配项。你可以在替换字符串中使用 反向引用\\0 是整个正则表达式匹配项,\\1 是第一个反向引用,\\2 是第二个反向引用,依此类推。最高的反向引用是 \\9ereg_replace 区分大小写。 eregi_replace 是不区分大小写的等效项。

array split (string pattern, string subject [, int limit]) 使用正则表达式模式将 subject 字符串拆分为一个字符串数组。该数组将包含正则表达式匹配项之间的子字符串。实际匹配的文本将被丢弃。如果你指定一个限制,则结果数组将最多包含如此多的子字符串。subject 字符串将最多被拆分 limit-1 次,并且数组中的最后一个项目将包含 subject 字符串未拆分的剩余部分。 split 区分大小写。 spliti 是不区分大小写的等效项。

有关 ereg 函数集的更多信息,请参阅 PHP 手册

mb_ereg 函数集

mb_ereg 函数的工作方式与 ereg 函数完全相同,但有一个关键区别: ereg 将正则表达式和主题字符串视为一系列 8 位字符,而 mb_ereg 可以使用来自各种代码页的多字节字符。例如,使用 Windows 代码页 936(简体中文)编码的单词 中国(“China”)由四个字节组成:D6D0B9FA。使用正则表达式 . 对此字符串使用 ereg 函数将产生第一个字节 D6 作为结果。点完全匹配一个字节,因为 ereg 函数是面向字节的。在调用 mb_regex_encoding("CP936") 之后使用 mb_ereg 函数将产生字节 D6D0 或第一个字符 作为结果。

要确保您的正则表达式使用正确的代码页,请调用 mb_regex_encoding() 来设置代码页。如果您不这样做,则将使用 mb_internal_encoding() 返回或设置的代码页。

如果您的 PHP 脚本使用 UTF-8,则可以使用带有 /u 修饰符的 preg 函数来匹配多字节 UTF-8 字符,而不是单个字节。 preg 函数不支持任何其他代码页。

有关 mb_ereg 函数集的更多信息,请参阅 PHP 手册

进一步阅读

Mastering Regular Expressions这本书 Mastering Regular Expressions 不仅解释了您想了解和不想了解的有关正则表达式的所有内容。它还专门介绍了 PHP 的 preg 函数集,详细介绍了底层的 PCRE 正则表达式引擎,并提供了大量展示更高级技术的 PHP 代码示例。本书不涵盖 ereg 和 mb_ereg 函数集。

我对 Mastering Regular Expressions 一书的评论

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书评 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |