grep -i -o "</?1*>" file.html | grep -E "(font|center|strike|marquee|blink)" 可快速扫描HTML文件中的废弃标签。> ↩

怎么用 grep 快速扫出废弃标签
直接在终端跑这条命令,比打开浏览器查 W3C Validator 快得多:grep -i -o "。它会把所有匹配的起始标签原样列出来,一眼就能定位到哪行有问题。
注意三点:一是 grep 默认不跨行,所以只抓起始标签(如 <font></font>),但不会误伤注释或属性值里的字符串;二是 -i 让它忽略大小写,防住 <font></font> 这类写法;三是别漏掉 frame 相关标签——它们在现代页面里基本等于“技术债实体化”,必须清。
如果要批量扫整个目录,加 -r 参数:grep -r -i "<font .>。但注意别扫 <code>node_modules 或构建产物目录,否则结果全是噪音。
为什么不能只靠正则删注释和模板残留
正则表达式能快速干掉 <!--[\s\S]*?--> 或 {{.*?}},但它无法判断上下文是否安全。比如 <!-- START: header --> 看似是注释,但若构建工具真在运行时注入内容,删了就崩;又比如 <div class="card">{{title}}</div>,删掉 {{title}} 后,class="card" 可能就没人用了,但正则看不到这层依赖。
立即学习“前端免费学习笔记(深入)”;
更危险的是嵌套干扰:一个未闭合的 <!-- 会让 [\s\S]*? 匹配到文件末尾,连带吞掉后面的真实 HTML 标签。实际清理前,建议先用 grep -n "<!--" index.html 和 grep -n "-->" index.html 对注释行号做粗略配对检查。
真正稳妥的做法是分两步:先用正则筛出疑似项,人工确认模式意图;再用 DOM 解析器(如 Python 的 lxml.html 或 Node.js 的 jsdom)做节点级校验,只删掉既无 JS 绑定、也无 CSS 规则生效的节点。
用 DOMPurify 做语义安全过滤时容易踩的坑
DOMPurify.sanitize() 是目前最靠谱的客户端 HTML 净化方案,但它默认白名单不包含 <header></header>、<nav></nav> 等语义标签——你得手动加进去,否则这些合法标签会被直接抹掉。
常见疏漏点包括:
- 没配置
ALLOWED_TAGS就调用,结果<section></section>全变成纯文本 - 忘了开
RETURN_DOM_FRAGMENT选项,导致返回的是字符串而非可操作 DOM,后续没法再遍历删冗余div - 对
href属性只允许http://和https://,却忘了内部链接需要/和#协议
更隐蔽的问题是:DOMPurify 不处理注释、空格、冗余包裹层。它只保安全,不保简洁。所以它该和 lxml 或自定义脚本配合使用,而不是当“万能清洁剂”。
扫描嵌套过深或无样式 div 的实操路径
打开 Chrome DevTools → Elements 面板 → Ctrl+Shift+F 搜 <div> → 点开任意一个匹配项 → 右键选 “Break on subtree modifications” → 刷新页面。如果某个 <code><div> 在整个生命周期里从未被 JS 修改、也查不到对应 CSS 规则(用 <code>div[class] 在 Styles 面板搜索无结果),那它基本就是个空壳。
特别注意 CMS 导出内容里的 <div data-id="xxx"> 和低代码平台生成的 <code><div class="block-wrapper-2024"> ——这类标签几乎从不绑定事件,也不承载样式,删前只需确认其子元素没用到相对定位或 flex 上下文依赖即可。<p>性能上,DOM 节点每多 100 个,解析就慢 20–40ms;5 层嵌套按钮比单个 <code><button></button> 多花约 60ms。这不是理论值,是真实跑 performance.measure() 测出来的。别信“看起来没影响”的直觉。



















