如何在AJAX请求中正确转义HTML并在PHP端还原?
解决AJAX传递HTML到PHP后无法还原的问题
看起来你卡在了AJAX传递HTML到PHP的JSON序列化/解析坑上了,我来帮你捋清楚问题出在哪,以及怎么解决。
首先得明确你遇到的两个核心问题:
- 未转义HTML直接序列化JSON,导致PHP端
json_decode返回NULL——这是因为HTML里的特殊字符(比如双引号、换行符、斜杠)破坏了JSON的语法结构,让PHP无法正确解析。 - 自定义
escapeHtml转义后,PHP端得到的内容异常——大概率是你的转义把HTML标签本身(比如<>)转成了HTML实体(</>),导致存到数据库后无法还原成原始标签结构。
正确的处理流程(推荐)
前端:让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>变成了<p>),可以在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
相关产品推荐
相关产品推荐

