PHP json_encode斜杠转义问题详解与 JSON_UNESCAPED_SLASHES正确用法

代码笔记2小时前更新
9 0 0

一、问题背景:json_encode 为什么会把 / 变成 \/

在使用 PHP 的 json_encode() 函数时,很多开发者会发现一个现象:


$url = "https://www.46.la/tool/html-entities";
echo json_encode($url);

输出结果如下:


"https:\/\/www.46.la\/tool\/html-entities"

可以看到,URL 中的 / 被转义成了 \/。这让很多人误以为数据被“破坏”了,实际上这是 JSON 标准允许的行为。

PHP json_encode斜杠转义问题详解与 JSON_UNESCAPED_SLASHES正确用法

json斜杠转义

二、根本原因:JSON 规范中的转义规则

根据 JSON 标准(RFC 8259),斜杠 / 可以被转义为 \/,但这并不是必须的。

PHP 之所以默认进行转义,主要是出于以下安全考虑:

  • 防止在 HTML 的 <script> 标签中输出 JSON 时被错误解析
  • 避免出现 </script>浏览器提前结束脚本的问题
  • 提高嵌入 HTML 时的安全性

例如:


<script>
var data = {"url":"https:\/\/example.com"};
</script>

这种写法可以避免浏览器误解析 </script>

三、是否会影响 JSON 解析?

答案是:不会

无论是:


"https:\/\/example.com"

还是:


"https://example.com"

JavaScript 中解析结果是完全一样的:


JSON.parse('"https:\/\/example.com"');
// 等同于
JSON.parse('"https://example.com"');

也就是说,这只是“显示形式不同”,数据本身没有变化。

四、解决方案:使用 JSON_UNESCAPED_SLASHES

如果你希望输出更直观、可读性更强的 JSON,可以使用:


echo json_encode($data, JSON_UNESCAPED_SLASHES);

这样输出结果将变为:


"https://www.46.la/tool/html-entities"

五、推荐组合写法(开发中最佳实践)

在实际开发中,建议结合多个参数一起使用:


echo json_encode(
    $results,
    JSON_UNESCAPED_UNICODE 
    | JSON_UNESCAPED_SLASHES 
    | JSON_PRETTY_PRINT
);

作用说明:

  • JSON_UNESCAPED_UNICODE:避免中文被转成 \uXXXX
  • JSON_UNESCAPED_SLASHES:避免 URL 中的斜杠转义
  • JSON_PRETTY_PRINT:格式化输出,方便调试

六、使用场景分析

1、API 接口输出

推荐开启 JSON_UNESCAPED_SLASHES,让返回数据更清晰:

  • 更易调试
  • 更利于日志记录
  • 更方便前端查看

2、SEO 工具开发

例如你在做 URL 分析工具或站长工具时:

  • 用户需要直接看到真实 URL
  • 不希望出现 \/ 影响可读性

这种情况下必须关闭斜杠转义

3、安全敏感场景

如果 JSON 会嵌入 HTML 页面中:

  • 可以保留默认转义(更安全)
  • 或使用 CSP / JSON script 标签方式替代

七、常见误区

误区一:以为数据被破坏

实际上只是显示问题,JSON 解析完全一致。

误区二:强行替换字符串

错误写法:


str_replace('\/', '/', json_encode($data));

这种方式不推荐,可能导致不可预期问题。

误区三:忽略 Unicode 转义

如果你不加:

  • 中文会变成 \u4e2d\u6587

影响用户体验。

八、总结

PHP 的 json_encode() 默认转义斜杠是一种安全策略,而不是错误行为。对于现代 Web 开发来说:

  • 推荐开启 JSON_UNESCAPED_SLASHES
  • 配合 JSON_UNESCAPED_UNICODE 使用
  • 开发 API 时优先保证可读性

最终推荐标准写法:


echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);

比对写法:

// 输出 JSON
echo json_encode($results, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo json_encode($results, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);

这样既保证数据规范,又兼顾开发体验与可读性。

© 原创声明:本文由 四六啦工具 于 2 小时 前发表在 代码笔记 分类目录中,最后更新于2026年4月6日,转载请注明本文永久链接:https://www.46.la/php-json-encode-unescaped-slashes

相关文章

暂无评论

本文暂时没有评论,来添加一个吧(●'◡'●)