
本文讲解如何在 php 网站中正确显示从 ckeditor 等富文本编辑器存入数据库的 html 内容,重点区分「纯文本提取」与「html 安全渲染」两种需求,并提供过滤、转义与输出的最佳实践方案。
本文讲解如何在 php 网站中正确显示从 ckeditor 等富文本编辑器存入数据库的 html 内容,重点区分「纯文本提取」与「html 安全渲染」两种需求,并提供过滤、转义与输出的最佳实践方案。
当你使用 CKEditor(或其他现代富文本编辑器)将内容保存至数据库时,实际存储的是标准 HTML 字符串,例如:
<p>Hello <strong>world</strong>!</p><ul><li>Item 1</li><li>Item 2</li></ul>
这不是 RTF(Rich Text Format),而就是合法的 HTML 片段——因此无需复杂的 RTF 解析(如答案中误引的 \rtf1\ansi... 示例)。CKEditor 默认输出 HTML,而非二进制富文本格式。关键在于:你希望「展示」它,而非「编辑」它——这意味着你需要安全地渲染 HTML,而非剥离所有标签。
✅ 正确做法:渲染 HTML(保留样式,防范 XSS)
直接 echo $content 是危险的,因为用户可能注入恶意脚本(如 <script>alert(1)</script>)。应使用 HTML 过滤库进行白名单净化:
立即学习“前端免费学习笔记(深入)”;
推荐方案:使用 HTMLPurifier(最可靠)
require_once 'HTMLPurifier/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'p,b,i,u,em,strong,ul,ol,li,a[href|title],br,span[style]'); // 按需放宽
$purifier = new HTMLPurifier($config);
$safeHtml = $purifier->purify($dbContent); // 来自数据库的原始 HTML
echo $safeHtml; // 安全输出到页面⚠️ 注意:切勿用 strip_tags() 替代——它会移除所有标签,导致加粗、列表、链接等功能完全丢失;也禁止用 htmlspecialchars() 全局转义,否则
会被显示为文字而非段落。
❌ 常见误区澄清
- strip_tags($str):仅适合「提取纯文本摘要」场景(如文章预览),但会彻底删除所有格式,不符合“显示富文本”的需求。
- html_entity_decode() + strip_tags() 组合:仍无法解决 XSS 风险,且逻辑错误(先解码再删标,可能引入新漏洞)。
-
手动正则替换(如 preg_replace('/
/', ''))
:不可靠、易出错、无法处理嵌套或属性,且不防攻击。
✅ 补充:若真需纯文本(无任何格式)
仅当明确要求「仅显示文字内容」时,才使用:
$plainText = strip_tags($dbContent);
// 可选:进一步清理多余空白
$plainText = preg_replace('/\s+/', ' ', trim($plainText));
echo htmlspecialchars($plainText, ENT_QUOTES, 'UTF-8');总结
| 场景 | 推荐方法 | 安全性 | 保留格式 |
|---|---|---|---|
| 在前端展示富文本(推荐) | HTMLPurifier 白名单过滤 | ✅ 高 | ✅ 是 |
| 生成纯文本摘要/SEO 描述 | strip_tags() + htmlspecialchars() | ✅ 高 | ❌ 否 |
| 直接 echo / htmlspecialchars() | ❌ 禁止 | ❌ 低(XSS 风险)或 ❌ 无格式 | ❌ 或 ❌ |
始终将数据库中的 HTML 视为受信但需验证的内容,而非原始字符串。部署前务必测试恶意输入(如 ),确保净化逻辑生效。


















