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

如何在WYSIWYG编辑器中保持HTML属性不被修改?

解决Summernote编辑器修改模板HTML代码的问题

你遇到的核心问题是Summernote默认的HTML清理机制识别不了模板引擎(比如Twig这类)的语法标签,把{%if ... %}这类代码当成无效的HTML属性内容处理,才会把你的原始代码改得面目全非。下面给你几个实用的解决方案:

方法1:用protect配置保护模板语法块

这是最直接省心的方法,通过protect选项添加正则表达式,告诉编辑器不要修改匹配到的模板代码块。修改你的初始化代码:

$('#summernote').summernote({
  height: 300,
  protect: [
    /{%[\s\S]*?%}/g // 匹配所有{% 开头、%}结尾的模板代码块
  ]
});

配置完成后,编辑器会自动跳过对这些模板标签的处理,完整保留你写的条件判断代码。

方法2:禁用HTML清理(谨慎使用)

如果你完全不需要编辑器帮你清理HTML代码,可以直接关闭这个功能,但要注意——这样会让编辑器失去XSS防护能力,只适合在完全可控的内部环境下使用:

$('#summernote').summernote({
  height: 300,
  cleanHtml: false
});

方法3:自定义清理逻辑(兼顾安全与模板完整性)

如果既想保留编辑器的HTML清理功能,又不想破坏模板语法,可以用customCleaner自定义清理流程:先把模板标签替换成占位符,等编辑器完成清理后再替换回去。代码如下:

$('#summernote').summernote({
  height: 300,
  customCleaner: function (html) {
    // 第一步:把所有模板块临时存储,用占位符替换原内容
    const templateBlocks = [];
    html = html.replace(/{%[\s\S]*?%}/g, (match) => {
      const id = `TEMP_TEMPLATE_${templateBlocks.length}`;
      templateBlocks.push({ id, content: match });
      return id;
    });

    // 第二步:让编辑器执行默认的HTML清理操作
    html = $.summernote.core.cleanHtml(html);

    // 第三步:把占位符换回原始模板代码
    templateBlocks.forEach(block => {
      html = html.replace(block.id, block.content);
    });

    return html;
  }
});

另外提个小细节:你的原始代码里loop.first=='first'没有空格,虽然大多数模板引擎能识别,但建议改成loop.first == 'first'(添加空格),这样编辑器的语法识别会更友好,不过上面的保护配置已经能处理两种情况啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:52:13