PHP 正则定界符与修饰符
PHP 的模式不是裸字符串,而是用定界符包裹的表达式:第一个字符作为定界符,末尾必须用同一个字符收尾,定界符之外还能追加修饰符调整匹配语义。定界符与修饰符是 PHP 正则特有的两层书写约定,忘记闭合或在模式中出现未转义的定界符,都会让模式直接失效。
基本信息
| 定界符选择 | 不能是字母、数字、反斜杠与空白字符,常用斜杠、井号与波浪号 |
|---|---|
| 成对形式 | 使用成对符号时,右侧使用对应的闭合符号,模式内出现同类符号仍要注意转义 |
| 修饰符位置 | 写在末尾定界符之后,多个修饰符可连写,顺序不影响语义 |
| 模式内冲突 | 模式中出现与定界符相同的字符必须转义,或改用其他定界符 |
典型使用场景
- 包含大量斜杠的模式:处理路径与 URL 时改用其他定界符可省掉大量转义
- 忽略大小写匹配:域名与关键字匹配时启用忽略大小写修饰符
- 多字节文本:处理中文与表情时启用 UTF-8 模式,避免按字节切分
- 逐行处理:多行文本里让锚点按行生效,便于按行提取
- 长模式维护:可读模式让模式可以分行书写并加注释,便于评审
定界符与修饰符用法
定界符与修饰符用法
preg_match('/^\d{4}$/', $year); // 斜杠定界符,最常用
preg_match('#^/api/v1/#', $path); // 换用井号,路径里的斜杠无需转义
preg_match('~^(?<user>\w+)~', $s, $m); // 波浪号定界符,配合命名组
preg_match('/abc/i', 'ABC'); // 忽略大小写
preg_match('/^a.+z$/s', $block); // 点号匹配换行,用于跨行内容
preg_match('/^\w+$/u', '中文'); // UTF-8 模式,按字符处理多字节文本
preg_match('/ a \s+ b /x', 'a b'); // 可读模式,空白被忽略
preg_match('/^abc/D', "abc\n"); // 末尾锚点严格匹配串尾
preg_quote($userInput, '#'); // 与所选定界符配套转义常用修饰符
| 修饰符 | 作用 | 注意 |
|---|---|---|
| i | 忽略大小写 | 折叠规则与字符集相关 |
| m | 锚点按行生效 | 影响行首行尾的含义 |
| s | 点号匹配换行 | 贪心量词的作用范围随之变大 |
| x | 可读模式 | 模式内真实空白需转义 |
| u | UTF-8 模式 | 要求模式与主题为合法 UTF-8 |
| A | 强制从串首匹配 | 等同固定开头,不受多行影响 |
| D | 末尾锚点严格匹配串尾 | 不匹配末尾换行之前的位置 |
| U | 反转量词的贪心方向 | 影响所有量词,谨慎使用 |
定界符与转义函数必须配套:调用转义函数时把所用定界符一并传入,否则模式内出现该字符时仍然会破坏结构,这是拼接模式时很常见的遗漏。
修饰符组合会互相影响:可读模式让空白被忽略,若此时需要匹配真实空格必须显式转义;多行与末尾严格匹配的组合也会改变锚点行为,调整修饰符后要重新验证样本。