PHP PCRE 函数的匹配流程
PHP 的正则接口围绕 PCRE 库,函数名统一以接口前缀开头。使用上最容易吃亏的地方是返回值语义:布尔判断与严格比较得到的结果不同,未匹配到的可选组在结果里是空字符串而不是空值,出错时返回的是假值而非异常。区分「没匹配上」与「执行失败」是使用这些函数的基本功。
基本信息
| 常用函数 | 单次匹配、全局匹配、替换、回调替换、按模式切分、字面量转义 |
|---|---|
| 返回值语义 | 单次匹配命中返回 1、未命中返回 0、执行出错返回假值,必须严格比较 |
| 结果数组 | 下标 0 是整体匹配,之后按组号排列,命名组另以名字为键出现 |
| 可选组 | 未参与匹配的组以空字符串占位,无法与「匹配到空内容」区分 |
典型使用场景
- 表单校验:判断整串是否符合规则,注意补上两端锚定
- 字段提取:从文本中取出多段内容,命名组能让取值代码更清晰
- 批量替换:按模式改写文本,需要逻辑判断时改用回调形式
- 模板切分:按分隔符规则拆分字符串,保留或丢弃空片段需要显式指定
- 用户输入拼接:把输入嵌进模式前必须先做转义
返回值与结果处理
返回值与结果处理
$ok = preg_match('/^\d{6}$/', $code); // 返回 1、0 或 false
if ($ok === 1) { echo '命中'; } // 严格比较才能与出错区分
if ($ok === false) { error_log('模式或执行出错'); }
preg_match('/(a)?(b)/', 'b', $m); // $m[1] 为空字符串:未参与的组
$n = preg_match_all('/\w+/', $s, $all); // 返回匹配次数
preg_replace('/\s+/', ' ', $s); // 替换,出错时返回 null
preg_replace_callback('/\d+/', fn($m) => $m[0] * 2, $s); // 回调处理
preg_split('/[,;]/', $line, -1, PREG_SPLIT_NO_EMPTY); // 丢弃空片段
preg_quote($input, '/'); // 拼接前转义函数与返回值
| 函数 | 作用 | 返回值 |
|---|---|---|
| 单次匹配 | 找第一个匹配 | 1、0 或假值 |
| 全局匹配 | 找出全部匹配 | 匹配次数或假值 |
| 替换 | 按模式改写 | 结果字符串或空值 |
| 回调替换 | 由函数决定替换内容 | 结果字符串或空值 |
| 切分 | 按模式拆分 | 数组或假值 |
| 转义 | 转义元字符 | 转义后的字符串 |
出错时可以用错误查询接口拿到具体原因,例如达到回溯上限、递归上限或主题串不是合法 UTF-8;只判断返回值会让这些原因全部被当成「不匹配」处理,排障时缺少关键信息。
主题串默认按字节处理,涉及多字节字符时要使用对应的修饰符,否则点号与量词会按字节切分,中文与表情符号的处理结果会与直觉不同。