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

DOMPurify清理Mustache模板时结构被篡改,如何禁用自动修复?

解决DOMPurify清理Mustache模板时节点移位的问题

问题的核心不是DOMPurify主动修改了结构,而是它依赖的浏览器DOM解析器会自动修正不符合HTML规范的代码——HTML标准里<table>元素的直接子节点只能是<thead>、<tbody>、<tr>这类合法表格元素,像{{#section}}这种纯文本节点不允许放在<table>内部,所以DOM解析器会把这些文本节点自动移到<table>外面,DOMPurify只是基于修正后的DOM生成清理结果。

下面是两种可行的解决方法:

方法一:预处理转HTML注释,后处理还原

把Mustache区块转换成HTML注释(注释可以合法放在<table>内部),清理完成后再转换回原语法:

// 预处理:将Mustache区块包裹为HTML注释
const preprocessed = model.html_template.replace(/({{#.*?}}|{{\/.*?}})/g, '<!--$1-->');

// 执行DOMPurify清理
const sanitized = DOMPurify.sanitize(preprocessed);

// 后处理:将注释还原为Mustache语法
const finalTemplate = sanitized.replace(/<!--({{#.*?}}|{{\/.*?}})-->/g, '$1');

如果你的Mustache语法包含空格(比如{{ # section }}),可以调整正则表达式适配:

const preprocessed = model.html_template.replace(/({{\s*#.*?}}\s*|{{\s*\/.*?}}\s*)/g, '<!--$1-->');
const finalTemplate = sanitized.replace(/<!--({{\s*#.*?}}\s*|{{\s*\/.*?}}\s*)-->/g, '$1');

方法二:启用DOMPurify的XML模式

XML解析器不会自动修正HTML结构(因为XML是严格语法),你可以通过USE_XML选项强制DOMPurify使用XML模式处理:

const sanitized = DOMPurify.sanitize(model.html_template, {
  USE_XML: true
});

注意:XML模式要求所有HTML标签必须正确闭合(比如不能出现<td>不闭合的情况),如果你的模板存在不规范的HTML标签,这种方法可能会导致解析错误,因此更适合结构严谨的模板。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:00:31