织梦后台编辑器在保存文章时会自动"清洗"HTML,把手工写的 div、script、style、iframe 等标签过滤掉,把代码块强制换行、把缩进去掉。对于技术博客、需要嵌入视频或自定义样式的站点,这是高频痛点。本文讲解织梦编辑器禁止自动格式化代码的几种方案,覆盖 ckeditor 与 ueditor 两种编辑器。
一、自动格式化的来源
编辑器对内容的处理分两个阶段:
- 编辑器内部:ckeditor / ueditor 在切换"源码/可视"模式时,会调用 HTML 美化函数,重新格式化代码
- 入库前过滤:织梦
archives_add.php、archives_edit.php在保存前调用HtmlReplace、RemoveXSS等函数过滤危险标签
要彻底禁止自动格式化,需同时处理这两处。
二、关闭 ckeditor 自动格式化
找到 /include/ckeditor/config.js,加入以下配置:
CKEDITOR.editorConfig=function(config){
config.allowedContent=true; // 允许所有标签与属性
config.removeFormat=false; // 不剥离格式
config.fillEmptyBlocks=false; // 不自动填充空块
config.autoParagraph=false; // 不自动加 p 标签
config.enterMode=CKEDITOR.ENTER_BR; // 回车生成 br 而非 p
};
allowedContent=true 是关键,它关闭了 ckeditor 的"过滤未授权标签"机制。
三、关闭 ueditor 自动格式化
编辑 /include/ueditor/ueditor.config.js,关闭自动转义与代码美化:
window.UEDITOR_CONFIG={
autoClearEmptyNode: false, // 不自动清理空节点
allowDivTransToP: false, // div 不转 p
disabledTableInTable: false,
sourceEditorFirst: true, // 默认源码模式
// 关闭 XSS 过滤(仅内网/可信编辑场景)
filterRules: {},
whiteList: {}
};
其中 allowDivTransToP 是常被忽视的关键,它默认会把所有 div 转成 p,导致布局错乱。
四、关闭入库前的标签过滤
即使编辑器不格式化,入库时织梦仍会过滤。打开 /dede/archives_add.php,找到:
$body=AnalyseHtmlBody($body, $description, $litpicname, $keywords, $dutyadmin);
// 在下方加上,保留原始 HTML
$body=preg_replace("/<script/i", "<script", $body);
更稳妥的做法是注释掉 RemoveXSS($body) 调用,但需评估站点是否有可信编辑场景,否则会引入 XSS 风险。建议保留过滤、改用白名单方式只放行特定标签。
五、注意事项
关闭 XSS 过滤后,务必限定编辑权限,普通用户发布的表单不能走这条链路。
ckeditor 的 allowedContent=true 会同时关闭样式过滤,可能导致复制 Word 内容时带入大量冗余标签。
ueditor 的 sourceEditorFirst 会让普通编辑看到源码,对非技术人员不友好,按角色分配。
六、后续优化方向
搞定织梦编辑器禁止自动格式化代码后,建议为不同栏目配置差异化策略:技术专栏关闭过滤、允许完整 HTML;普通资讯保留过滤保障安全。同时把"代码块"按钮接入 SyntaxHighlighter 或 Prism,让技术文章自带高亮渲染。把代码保护与编辑器扩展结合起来,让织梦既能承载新闻资讯,也能胜任技术博客的专业内容生产,把一个老 CMS 用出新时代的体验。