
在使用 `preg_replace` 过滤字符串时,若需保留斜杠 `/`,必须将其显式添加到正则表达式的字符类中并正确转义;否则 `/` 会被当作分隔符或被误过滤,导致结果缺失。
在 PHP 中,preg_replace('/[^A-Za-z0-9|\- +]/', '', $str) 这类正则表达式常用于白名单式清洗——即只保留指定字符,其余全部剔除。但该写法存在两个关键问题:
- / 未包含在允许字符中:正则中的字符类 [^...] 表示“非以下字符”,而 / 并不在其中,因此被默认删除;
- 特殊字符未转义:+、- 在字符类中有特殊含义(如 a-z 表示范围,+ 在类外是量词),虽在部分上下文中可不转义,但为严谨起见,应显式转义。
✅ 正确做法是:
- 将 / 添加进字符类,并用 \/ 转义(因正则分隔符为 /);
- 将空格替换为 \s(更通用,涵盖空格、制表符等);
- 对 + 和 - 进行转义(\- 和 \+),尤其当 - 不处于字符类开头/结尾时,避免被解析为范围连接符。
⚠️ 注意事项:
- 若改用其他分隔符(如 ~ 或 #),可避免对 / 转义:preg_replace('~[^A-Za-z0-9\s\-+\/]~', '', $name) → 可简写为 ~[^A-Za-z0-9\s\-+/]~;
- htmlentities() 和 htmlspecialchars() 连用是冗余的,通常只需 htmlspecialchars($jurnalName, ENT_QUOTES, 'UTF-8') 即可防止 XSS,且保留原始符号语义;
- 数据库字段不支持“特殊字符”应优先考虑调整字段类型(如使用 VARCHAR 配合 UTF8MB4)或编码规范,而非依赖前端清洗。
总结:正则白名单策略中,所有需保留的符号都必须显式列出并妥善转义。斜杠 / 并非默认保留字符,遗漏它就会导致数据截断——这是开发中常见却易被忽视的细节。
立即学习“PHP免费学习笔记(深入)”;











