\_del 标签非 html 原生语法,浏览器直接忽略;需用正则替换为语义化的 元素并转义内容防 xss,服务端转换更可靠,css 无法匹配纯文本中的 _del。

_DEL 标签不是 HTML 原生语法,浏览器默认完全忽略它——文字原样显示,花括号都露在外面。想让它真出删除线,必须主动转换为语义正确的 <del></del> 元素,并配合适当样式。
为什么直接写 _DEL{xxx} 没反应
因为 HTML 解析器不认识 _DEL,它既不是标签、也不是实体、更不是自定义元素(没用 customElements.define 注册)。你贴进去的只是普通文本,连 DOM 节点都不是。常见错误是后端吐出一串带 _DEL 的纯文本,前端没做任何处理就 innerHTML 渲染,结果用户看到的是 "_DEL{已删内容}" 字面量。
用正则 replace 把 _DEL{} 转成 最稳
这是兼容性最好、不依赖框架、前后端都能用的方案。关键不在正则多酷,而在防崩细节:
- 用非贪婪匹配:
/_DEL\{([^}]+)\}/g,避免跨多个_DEL段落误吞 - 必须加
g标志,否则只替换第一个 - 对捕获内容做 HTML 实体转义,防止 XSS;可用
DOMPurify.sanitize(content),或更轻量的document.createTextNode(content).textContent中转 - 示例(前端):
text.replace(/_DEL\{([^}]+)\}/g, (_, content) => `<del>${escapeHtml(content)}</del>`)
后端模板里提前转换比前端 JS 更可靠
页面加载时若等 JS 执行完才渲染删除线,会有一瞬间“未样式化文本”闪现,尤其在弱网或低端设备上明显。推荐在服务端就完成转换:
- Python(Jinja2):
{{ content | regex_replace('_DEL\{([^}]+)\}', r'<del>\1</del>') }} - Node.js(EJS):
`<del>${c}</del>`) %> - 注意:如果原始文本含
{或},需先转义或改用其他分隔符,否则正则会错位
别指望 CSS 选中纯文本里的 _DEL
CSS 无法基于文本内容选择元素,[data-del] 或 :contains()(已废弃)都不行。有人试过用 .container:has(span:contains("_DEL")),但不可靠且不兼容旧浏览器。真正可行的只有两种路径:一是 JS 替换为 <del></del>,二是约定输入时就用带 class 的 <span class="del-inline"></span>,再配 CSS:.del-inline { text-decoration: line-through; color: #666; }。但后者丧失语义,且 text-decoration 在小字号下容易断开,建议用 border-bottom: 1px solid #999; 替代。
{ 和嵌套 _DEL,这时正则就会失效——得先清洗再匹配,或者改用 AST 解析器逐节点处理。











