织梦编辑器禁止自动格式化代码

织梦后台编辑器在保存文章时会自动"清洗"HTML,把手工写的 div、script、style、iframe 等标签过滤掉,把代码块强制换行、把缩进去掉。对于技术博客、需要嵌入视频或自定义样式的站点,这是高频痛点。本文讲解织梦编辑器禁止自动格式化代码的几种方案,覆盖 ckeditor 与 ueditor 两种编辑器。

一、自动格式化的来源

编辑器对内容的处理分两个阶段:

  • 编辑器内部:ckeditor / ueditor 在切换"源码/可视"模式时,会调用 HTML 美化函数,重新格式化代码
  • 入库前过滤:织梦 archives_add.phparchives_edit.php 在保存前调用 HtmlReplaceRemoveXSS 等函数过滤危险标签

要彻底禁止自动格式化,需同时处理这两处。

二、关闭 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 用出新时代的体验。