
PHP里用 stripslashes() 去掉反斜杠转义
直接说结论:大多数情况下,用 stripslashes() 就够了。它专干一件事——把字符串里多余的反斜杠(比如 "、'、\)去掉,还原成原始内容。
常见错误现象:$_POST 或 $_GET 里拿到的字符串带双层转义,比如本该是 O'Reilly,结果变成 O'Reilly,甚至 O\'Reilly;或者 JSON 字符串里出现 " 被当成字面量显示出来。
- 只对单引号、双引号、反斜杠、NULL 字符生效,不碰其他字符
- 如果源字符串本身没被转义,
stripslashes()不会报错,但可能误删你本来就要的 - PHP 8.1+ 默认关闭了
magic_quotes_gpc,所以现在绝大多数情况不用再“自动去一层”,别无脑套两层stripslashes()
htmlspecialchars_decode() 是用来反转义 HTML 实体的
很多人混淆“反斜杠转义”和“HTML 实体转义”。如果你看到的是 <、"、' 这类,那不是 stripslashes() 的活儿,得用 htmlspecialchars_decode()。
使用场景:从数据库或 API 拿到已用 htmlspecialchars() 处理过的文本,要原样输出到页面前需先解码;或者解析用户提交的富文本字段时还原符号。
立即学习“PHP免费学习笔记(深入)”;
- 默认只解码
"、'、&、、<code>>,不处理 Unicode 实体如♥ - 第二个参数可选
ENT_QUOTES或ENT_NOQUOTES,影响单/双引号是否被解码 - 注意:它不会动反斜杠,跟
stripslashes()完全不重叠,混用反而可能出问题
JSON 字符串里的转义不能靠 stripslashes() 解决
如果你在处理 json_encode() 输出后又被当普通字符串二次转义的 JSON(比如前端传来的 "{"name":"Tom"}"),stripslashes() 会破坏 JSON 结构,导致 json_decode() 失败。
正确做法是先判断是否被多加了一层转义,再决定怎么清理:
- 用
json_decode($str, true)尝试直接解析,失败再看json_last_error()是不是JSON_ERROR_SYNTAX - 若确认是外层被
addslashes()或旧版框架自动转义过,可先stripslashes()再json_decode(),但仅限一次 - 更稳妥的是统一源头控制:关掉所有自动转义逻辑,让 JSON 始终以 raw string 形式传输
PHP 8+ 中要注意 get_magic_quotes_gpc() 已被移除
老项目迁移时容易踩坑:代码里还留着 if (get_magic_quotes_gpc()) { ... stripslashes() ... },PHP 8.0 起这函数直接报 Fatal error: Uncaught Error: Call to undefined function get_magic_quotes_gpc()。
这不是兼容性补丁能绕开的问题,必须删掉或替换逻辑:
- 检查是否真有外部输入被自动转义——现代 PHP(7.4+)默认没有,除非你自己调了
addslashes() - 用
filter_input()替代直接读$_GET/$_POST,它默认不转义 - 如果依赖某些老旧 CMS 或框架(如早期 ThinkPHP),查文档确认其输入过滤机制,别硬套老习惯
真正麻烦的从来不是函数怎么写,而是你不知道字符串到底被谁、在哪一层悄悄加过转义。多打几个 var_dump(),比背函数手册管用。











