正则表达式

语法

常见的正则表达式

字符 类型 解释
. 点号 任意字符
[...] 方括号 字符类:类中列举的所有字符
[^...] 方括号加脱字符 补充类:所有除列举字符外的字符
^ 脱字符 字符串或行的开始
$ 美元符号 字符串或行的结束
| 管道符 选择
(...) 圆括号 捕获组:也用于限定选择的范围
* 星号 0、1 或多个出现
+ 加号 1 或多个出现
? 问号 0 或 1 次出现

POSIX 字符类

类别 含义
[[:alpha:]] 任意字母
[[:digit:]] 任意数字
[[:xdigit:]] 十六进制字符
[[:alnum:]] 任意字母或数字
[[:space:]] 任意空白字符
[[:punct:]] 任意标点字符
[[:lower:]] 任意小写字母
[[:upper:]] 任意大写字母
[[:blank:]] 空格或制表符
[[:graph:]] 可显示和打印的字符
[[:cntrl:]] 控制字符
[[:print:]] 可打印字符,除控制字符外

Unicode 正则表达式

表达式 含义
\A 字符串开始
\b 单词的开始或结束
\d 数字
\D 非数字
\s 空白字符
\S 非空白字符
\w 字母、数字或下划线
\W 非字母、数字或下划线
\X Unicode 字符
\z 字符串结束

调试工具: https://regex101.com/

  • ?:: 忽略捕获组的编号。例如:((?:ignored_substring|other).)
  • ?!: 否定选择。例如:((?!excluded_substring).)
  • $1: 表示第一个捕获组的结果。
  • 注意:如果要搜索美元符号 "$",不能使用 "\$",因为它会被解析为变量格式。正确的写法是使用单引号:'\$'

在 PHP 中,正则表达式模式必须始终被分隔符符号包围。通常使用反引号(`),但也可以使用斜杠(/)和井号(#)。

此外,我们可以在分隔符后添加一些选项:

  • i:忽略大小写
  • m:使 . 匹配换行符
  • x:忽略空格
  • o:只处理第一个匹配
  • u:统计 Unicode 字符(多字节)

正则表达式的研究

自 PHP 5.3 以来,ereg() 函数被 preg_match() 替代,用于执行正则表达式搜索。

preg_match()

preg_match() 是执行正则表达式匹配的主要函数。它返回一个布尔值,并要求两个必需的参数:正则表达式模式和要扫描的字符串。

第三个参数是存储结果数组的变量。

第四个参数是一个 PHP 标志,用于修改函数的基本行为。

最小示例:

<?php
$string = 'PHP regex test for the English Wikibooks.';

if (preg_match('`.*Wikibooks.*`', $string)) {
    print('This texts talks about Wikibooks');
} else {
    print('This texts doesn\'t talk about Wikibooks');
}
?>

高级示例:

<?php
$string = 'PHP regex test for the English Wikibooks.';

if (preg_match('`.*Wikibooks.*`', $string), $results, $flag) {
    var_dump($results);
} else {
    print('This texts doesn\'t talk about Wikibooks');
}
?>

标志示例:

  • PREG_OFFSET_CAPTURE:显示匹配子串在字符串中的位置。
  • PREG_GREP_INVERT:在 preg_grep() 中显示反向匹配。

preg_grep()

此函数用于在数组中进行搜索。

preg_match_all()

要在一个数组中获取所有匹配的结果,可以将 preg_match 替换为 preg_match_all(),并使用 print_r() 打印。

示例:过滤文件内容:

$regex = "/\(([^)]*)\)/";
preg_match_all($regex, file_get_contents($filename), $matches);
print_r($matches);

替换

preg_replace()

该函数接受三个参数:要替换的字符串和替换的字符串。

<?php
// 将空格替换为下划线
$string = "PHP regex test for the English Wikibooks.";
$sortedString = preg_replace('`( )`', '_', $string);
echo $sortedString;
?>

preg_filter()

preg_replace() 相同,但其结果只包括替换后的内容。

preg_split()

分解一个字符串。


参考资料

Last modified: Friday, 10 January 2025, 12:50 AM