
本文详解在 wordpress rest api 返回 json 数据时,因 `str_replace` 中误用单引号导致 `\r\n` 被字面化为双反斜杠字符串(如 `\\r\\n\\r\\n`)的问题,并提供 php 端修复方案与前端兼容性补充,避免依赖 javascript 临时修补。
在您提供的代码中,问题根源非常明确:PHP 的单引号字符串('\r\n\r\n')不会解析转义字符,因此 str_replace('
', '\r\n\r\n', $return) 实际将字面字符串 \r\n\r\n(共8个字符:\、r、\、n…)插入到 $return 中,而非真正的回车换行符。当该字符串随后被 wp_send_json() 序列化为 JSON 时,反斜杠被自动转义,最终前端收到的是 \\r\\n\\r\\n —— 这是双重转义的结果,而非预期的段落分隔。✅ 正确做法是使用双引号字符串,让 PHP 解析 \r\n 为实际的 CRLF 换行控制符:
// ✅ 正确:双引号使 \r\n 被解释为真实换行符
$return = str_replace('', '', $return);
$return = str_replace('
', "\r\n\r\n", $return); // 注意:此处为双引号
// 输出 JSON,保留原始换行语义(JSON_UNESCAPED_SLASHES 对 / 有效,但换行符需提前正确生成)
wp_send_json($return, 200, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);⚠️ 补充说明与最佳实践:
- JSON_UNESCAPED_SLASHES 仅影响 / 字符,对 \r\n 无作用;换行符是否被转义取决于它在 PHP 字符串中是否已是“真实控制符”。只有真实换行符(\n 或 \r\n)在 JSON 编码时才可能以 \n 形式保留(取决于 JSON_UNESCAPED_UNICODE 等上下文),但更推荐在前端按需渲染,而非强求 JSON 内嵌格式化。
-
更健壮的 HTML 清洗建议:若目标是移除
标签并标准化段落间距,推荐使用 wp_strip_all_tags() 配合 preg_replace 处理多余空白,或直接用 DOMDocument 解析(适用于复杂 HTML)。例如:
// 移除所有 HTML 标签,合并连续空白为单个换行 $return = wp_strip_all_tags($return); $return = preg_replace('/\s+/', "\n", $return); // 替换任意空白为 \n $return = trim($return); - 前端不应承担“修复双重转义”职责:答案中建议的 response.data.replace(/\/\//g, "/") 是错误方向——它试图替换 //,而实际问题是 \\r\\n。若已产生双重转义,前端应做的是 JSON.parse() 后的字符串解码(现代浏览器自动处理),或使用 String.raw + 正则还原(不推荐)。根本解决必须在服务端确保输出是语义正确的字符串。
? 总结:永远区分 PHP 单引号(字面量)与双引号(支持转义);REST API 的响应内容应在序列化前就具备正确的字符语义;优先在服务端净化数据,而非在客户端打补丁。










