贝利信息

PHP 正则表达式中保留斜杠(/)的正确写法

日期:2026-01-15 00:00 / 作者:霞舞

在使用 `preg_replace` 过滤字符串时,若需保留斜杠 `/`,必须将其显式添加到正则表达式的字符类中并正确转义;否则 `/` 会被当作分隔符或被误过滤,导致结果缺失。

在 PHP 中,preg_replace('/[^A-Za-z0-9|\- +]/', '', $str) 这类正则表达式常用于白名单式清洗——即只保留指定字符,其余全部剔除。但该写法存在两个

关键问题:

  1. / 未包含在允许字符中:正则中的字符类 [^...] 表示“非以下字符”,而 / 并不在其中,因此被默认删除;
  2. 特殊字符未转义:+、- 在字符类中有特殊含义(如 a-z 表示范围,+ 在类外是量词),虽在部分上下文中可不转义,但为严谨起见,应显式转义。

✅ 正确做法是:

⚠️ 注意事项:

  • 若改用其他分隔符(如 ~ 或 #),可避免对 / 转义:preg_replace('~[^A-Za-z0-9\s\-+\/]~', '', $name) → 可简写为 ~[^A-Za-z0-9\s\-+/]~;
  • htmlentities() 和 htmlspecialchars() 连用是冗余的,通常只需 htmlspecialchars($jurnalName, ENT_QUOTES, 'UTF-8') 即可防止 XSS,且保留原始符号语义;
  • 数据库字段不支持“特殊字符”应优先考虑调整字段类型(如使用 VARCHAR 配合 UTF8MB4)或编码规范,而非依赖前端清洗。

总结:正则白名单策略中,所有需保留的符号都必须显式列出并妥善转义。斜杠 / 并非默认保留字符,遗漏它就会导致数据截断——这是开发中常见却易被忽视的细节。