最稳做法是用正则\s+[a-zA-Z][a-zA-Z0-9:-]*\s*=\s*["'][^"']*["']匹配并删除带值属性,再单独处理布尔属性,最后清理冗余空格,确保不误删viewBox等合法属性、不破坏含>的属性值、不遗漏换行场景。

怎么用正则安全清空所有 HTML 标签的属性?
直接删掉 class、id、style 等所有属性,但保留标签名和尖括号本身——这不是删除整个标签,而是把 <div class="a" id="b" data-x="y"> 变成 <div>。最稳的做法是匹配「属性名 + 等号 + 引号包裹的值」这一完整结构,并确保不跨引号边界。
关键点在于:不能用 [^>]* 这类宽泛写法,它会误吞 viewBox(SVG 中合法属性)、data- 类自定义属性,甚至破坏 <input type="text" value="a>b"> 里带 > 的字符串值。
- 勾选
.*按钮启用正则模式 - 查找框填:
\s+[a-zA-Z][a-zA-Z0-9:-]*\s*=\s*["'][^"']*["'] - 替换框留空
- 点
Replace All—— 注意:这个表达式会跳过无值属性(如disabled、checked),它们需单独处理
为什么不能用 [^>]* 一刀切?
这个看似简洁的写法在 Sublime 里实际非常危险:
- 它会把
<svg width="100" viewBox="0 0 100 100">中的viewBox当作普通属性删掉,导致 SVG 渲染失败 - 遇到
<img src="x" alt="A > B">时,[^>]*在第一个>就终止,只删掉src="x",留下alt="A > B"残留在标签内 - 无法识别属性名边界,可能误删
min-width中的width,或把data-id当成独立id属性处理 - 对换行敏感:
<div\n class="x">会被完全跳过,因为\n不在[^>]范围内
如何保留布尔属性(disabled、checked)?
HTML 中像 disabled、checked、readonly 这类无值属性,不能靠等号匹配。它们没有 =,所以前面那个正则不会动它们。如果你确实想一并清除,得额外加一条规则:
立即学习“前端免费学习笔记(深入)”;
- 查找:
\s+(?:disabled|checked|readonly|selected|required|multiple|novalidate|async|defer|autofocus|autoplay|controls|loop|muted|playsinline)\b - 注意末尾的
\b,防止误删data-disabled或disabled-class - 替换为空,且必须在清除带等号属性之后执行,否则顺序错乱可能导致残留空格
删完属性后,标签里还剩多余空格怎么办?
原始 <div class="x" id="y"> 经两轮替换后可能变成 <div > —— 多个空格挤在尖括号里,影响可读性,也可能干扰后续正则(比如匹配空标签时失效)。
- 先统一清理标签内多余空白:查找
<([a-zA-Z][^>]*)\s+>,替换为<$1> - 再处理开头空格:查找
<\s+([a-zA-Z][^>]*)>,替换为<$1> - 最后跑一次
>\s+<→><(仅用于修复相邻标签间的空格粘连,慎用)
真正麻烦的从来不是正则写不对,而是你没意识到那些“看起来只是空格”的地方,其实藏着未闭合的引号、被截断的注释,或者嵌套在 <script> 里的伪 HTML 字符串。



















