首页/开发/正则与编码速查/PHP 正则转义函数的使用

PHP 正则转义函数的使用

PHP 的转义函数把正则元字符加上反斜杠,是拼接用户输入与配置值时的必备步骤,第二个参数必须传入实际使用的定界符。它只适用于字面量,不可用于已经是模式的字符串,也不等同于替换模板的转义规则。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌​​​​‌‌‌​​​​​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌‌​​​‌​‌‌‌​‌​‌​‌‌​‌‌‌‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​​​​​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

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 转义函数尖括号与引号等输出到页面,与正则无关
替换模板转义模板专用的美元符号与反斜杠处理替换内容而非模式
转义只解决字符被当作语法的问题,不改变模式本身的复杂度:如果拼接后的模式存在嵌套量词,仍然会有回溯风险,输入长度限制与模式审查不能省。
定界符参数与实际使用的定界符必须一致:更换定界符时忘记同步修改,会让定界符本身未被转义,模式结构被破坏且报错信息不直观。

易错点

  • 忘记传定界符参数:定界符本身未被转义,输入中出现该字符就会破坏模式结构
  • 对已有模式调用转义函数:元字符全部变成字面量,规则静默失效为精确文本匹配
  • 用其他转义函数代替:字符串转义与 HTML 转义都不处理正则元字符,注入风险仍在
  • 在替换内容中使用该函数:替换模板遵循另一套转义规则,转义后会产生多余反斜杠
  • 把转义当作安全方案的全部:它防的是语法注入,不防模式本身带来的资源消耗风险

数据来源与参考

  • PHP 手册:preg_quote 函数与转义字符列表
  • PHP 手册:正则表达式模式与定界符说明
  • OWASP 备忘单:正则注入与转义实践

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/php-preg-quote-escape.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌​​​​‌‌‌​​​​​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌‌​​​‌​‌‌‌​‌​‌​‌‌​‌‌‌‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​​​​​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​