已被 HTML5 彻底移除,因其语义缺失、触发怪异模式且存在 XSS 风险;应改用转义后 组合,确保安全与标准兼容。

别用 <xmp></xmp> 标签 —— 它在 HTML5 中已被彻底移除,现代项目中继续使用会破坏语义、触发 quirks mode,且存在潜在 XSS 风险。
为什么 <xmp></xmp> 不能用了
浏览器虽仍支持 <xmp></xmp>(出于向后兼容),但它早在 HTML 4.01 就被标记为“deprecated”,HTML5 直接删除了该元素定义。W3C 明确不鼓励任何新代码使用它。
- 它无法嵌套自身,连
<xmp><xmp>...</xmp></xmp>都会提前截断 - 它绕过所有 HTML 解析规则:不转义、不执行 JS、不解析实体(
<会原样显示为<),但这也意味着你无法在里面写合法的 HTML 注释或 CDATA - 若用户输入含恶意脚本(如
<script>alert(1)</script>),<xmp></xmp>会照单输出——看似安全,实则误导开发者忽略真正需要的输入过滤和输出编码
<pre class="brush:php;toolbar:false;"></pre> + <code> 是标准替代组合
要安全、语义化地展示未转义的 HTML 源码,必须手动转义内容,再用 <pre class="brush:php;toolbar:false;"></pre> 保持格式、<code> 表明语义。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
-
<pre class="brush:php;toolbar:false;"></pre>只负责保留空格与换行,不处理字符转义;<code>是内联语义标签,应包裹在<pre class="brush:php;toolbar:false;"></pre>内部 - 必须对原始 HTML 字符做转义:
→ <code><,>→>,&→&(注意顺序:先转&,再转其他) - 服务端渲染时建议用语言内置函数(如 PHP 的
htmlspecialchars($str, ENT_NOQUOTES | ENT_HTML5),Python 的html.escape()) - 前端动态插入时避免直接拼接字符串,改用
textContent赋值,例如:el.textContent = '<div class="foo">Hello</div>'
遇到用户提交 HTML 源码怎么办
这是最易踩坑的场景:你拿到一段用户输入的 HTML 字符串,想“原样显示”给其他人看。
立即学习“前端免费学习笔记(深入)”;
- 绝对不要把用户输入直接塞进
<xmp></xmp>或未转义的<pre class="brush:php;toolbar:false;"></pre>—— 即使它看起来“没执行”,也违背了防御性编码原则 - 转义不是可选项,是必选项。哪怕只显示
<b></b>,也要转成<b>,否则后续若混入<script></script>就失控 - 如果需高亮语法,用
highlight.js或Prism.js等库,它们内部已强制转义输入,再做 token 渲染 - 注意:某些 CMS 或富文本编辑器导出的 HTML 可能含
<style></style>或<script></script>,这类内容不应走“源码展示”路径,而应走沙箱 iframe 或白名单过滤
真正麻烦的从来不是怎么让标签“不生效”,而是如何在保留可读性的同时守住安全边界——<xmp></xmp> 给了假安全感,而正确转义+语义标签才是稳住页面结构的最小依赖。


















