You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AJAX请求中正确转义HTML并在PHP端还原?

解决AJAX传递HTML到PHP后无法还原的问题

看起来你卡在了AJAX传递HTML到PHP的JSON序列化/解析坑上了,我来帮你捋清楚问题出在哪,以及怎么解决。

首先得明确你遇到的两个核心问题:

  1. 未转义HTML直接序列化JSON,导致PHP端json_decode返回NULL——这是因为HTML里的特殊字符(比如双引号、换行符、斜杠)破坏了JSON的语法结构,让PHP无法正确解析。
  2. 自定义escapeHtml转义后,PHP端得到的内容异常——大概率是你的转义把HTML标签本身(比如<>)转成了HTML实体(&lt;/&gt;),导致存到数据库后无法还原成原始标签结构。

正确的处理流程(推荐)

前端:让JSON.stringify自动处理转义,不要手动转义HTML

你不需要自己写escapeHtml来转义HTML标签,JSON本身的序列化方法JSON.stringify会自动处理JSON语法需要的特殊字符(比如把双引号转成\",换行转成\n),这样既能保证JSON结构完整,又不会破坏HTML本身的标签。

举个前端代码例子:

// 假设你从编辑器或DOM元素拿到原始HTML内容
const rawHtml = document.getElementById('content-editor').innerHTML;
const campaignData = {
  content: rawHtml,
  title: "我的营销活动",
  // 其他字段...
};

// 直接序列化,JSON.stringify会搞定JSON语法需要的转义
const jsonPayload = JSON.stringify(campaignData);

// 发送AJAX请求(这里用fetch,你也可以用jQuery.ajax等)
fetch('/campaign/save', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    // 别忘了加上CodeIgniter的CSRF Token,避免403错误
    'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
  },
  body: jsonPayload
})
.then(res => res.json())
.catch(err => console.error('请求失败:', err));

PHP(CodeIgniter控制器):正确接收并解析JSON

在CodeIgniter里,你需要直接获取原始的JSON请求体,而不是依赖$_POST(因为$_POST只处理表单编码的数据),然后用json_decode解析:

public function save() {
    // 获取原始JSON数据
    $rawJson = file_get_contents('php://input');
    // 解析成数组(第二个参数true返回数组,false返回对象)
    $campaign = json_decode($rawJson, true);

    // 检查解析是否成功
    if ($campaign === null) {
        log_message('error', 'JSON解析失败: ' . json_last_error_msg());
        return $this->output->set_status_header(400)->set_json([
            'success' => false,
            'msg' => '无效的JSON数据'
        ]);
    }

    // 此时$campaign['content']就是原始的HTML内容!
    // 直接存入数据库即可
    $this->db->insert('campaigns', [
        'content' => $campaign['content'],
        'title' => $campaign['title'],
        // 其他字段...
    ]);

    return $this->output->set_json(['success' => true]);
}

如果已经用了自定义escapeHtml转义,怎么还原?

如果你已经用了自定义方法把HTML转成了实体(比如<p>变成了&lt;p&gt;),可以在PHP端用htmlspecialchars_decode来还原:

// 假设$campaign['content']是转义后的实体字符串
$originalHtml = htmlspecialchars_decode($campaign['content'], ENT_QUOTES);
// 现在$originalHtml就是你要的原始HTML结构了

额外注意事项

  • 数据库字段类型:确保存储HTML的字段是TEXT或LONGTEXT,避免长度不够截断内容。
  • XSS防护:如果HTML是用户输入的,要注意XSS攻击。CodeIgniter的security->xss_clean()可以过滤危险标签,但如果你需要保留原始HTML,建议在输出HTML到页面的时候进行转义,或者用HTMLPurifier等工具过滤危险内容。
  • JSON解析错误排查:如果json_decode还是返回NULL,可以用json_last_error()和json_last_error_msg()查看具体错误原因,比如编码问题、语法错误等。

内容的提问来源于stack exchange,提问作者the_only_one

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:17:48