PHP 正则转义函数的使用
把字面量嵌进模式前必须转义:用户输入、配置值、文件路径里都可能包含正则元字符,未转义就会改变整条模式的语义,属于典型的注入类问题。PHP 提供的转义函数会为元字符加上反斜杠,并可连同定界符一起转义;正确用法是一句拼接,加上正确的定界符参数。
基本信息
| 转义范围 | 点号、反斜杠、星号、加号、问号、方括号、圆括号、大括号、竖线等正则元字符 |
|---|---|
| 定界符参数 | 传入所用定界符后,模式中的该字符也会被一并转义 |
| 适用对象 | 要被当作字面文本匹配的内容,例如用户输入与配置值 |
| 不适用对象 | 本身就是正则表达式的字符串,转义后模式会被破坏 |
典型使用场景
- 关键字搜索:把用户输入的关键词当作普通文本查找
- 白名单匹配:把配置中的条目安全拼进模式并锚定两端
- 日志检索:按文件名、路径等含特殊字符的字面量查找
- 按字面替换:替换时把待匹配内容转义,避免特殊字符被解释
- 规则拼接:由多段字面量拼出模式时统一走转义,减少人工遗漏
转义与拼接写法
转义与拼接写法
$kw = preg_quote($userInput, '/'); // 同时转义定界符
preg_match('/' . $kw . '/i', $text); // 作为字面文本查找,忽略大小写
preg_match('/^' . $kw . '$/', $text); // 需要整串等于该字面量时加锚定
$pat = '#' . preg_quote($path, '#') . '#'; // 换用井号定界符时同步传入
// 替换模板是另一套转义规则,不要用转义函数处理替换内容
preg_replace('/' . $kw . '/', 'replacement', $text);
// 错误示范:对已有模式使用转义函数会把元字符全部变成字面量
$broken = preg_quote('/\d+/'); // 结果不再具备数字匹配语义转义与相关函数对照
| 函数 | 转义目标 | 适用场景 |
|---|---|---|
| 正则转义函数 | 正则元字符与指定定界符 | 把字面量嵌入模式 |
| 加反斜杠类函数 | 引号等字符 | 旧式字符串入库,不能用于正则 |
| HTML 转义函数 | 尖括号与引号等 | 输出到页面,与正则无关 |
| 替换模板转义 | 模板专用的美元符号与反斜杠 | 处理替换内容而非模式 |
转义只解决字符被当作语法的问题,不改变模式本身的复杂度:如果拼接后的模式存在嵌套量词,仍然会有回溯风险,输入长度限制与模式审查不能省。
定界符参数与实际使用的定界符必须一致:更换定界符时忘记同步修改,会让定界符本身未被转义,模式结构被破坏且报错信息不直观。