PHP怎么反转义字符串 PHP还原转义后的字符串【必看】

1次阅读

PHP怎么反转义字符串 PHP还原转义后的字符串【必看】

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_QUOTESENT_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(),比背函数手册管用。

text=ZqhQzanResources