基础但危险,因[\s\s]*?会误匹配json字符串或注释中的导致截断;需先清除注释与cdata,再分步标记、抽检、替换。

为什么<script>[\s\S]*?</script>是基础但危险的写法
这个正则能匹配大多数标准 <script></script> 块,前提是启用了 . matches newline(即让 . 能吞换行符)。但它会误删以下内容:
• <script type="application/json">{"x": "</script>"} —— JSON 字符串里的 会被当作闭合标签,导致截断
• <script>// </script> is safe —— 行内注释里的 同样触发提前闭合
• <script src="xxx.js"></script> 这类空脚本块虽被匹配,但你可能想保留 src 属性本身(比如后续手动加载)
安全删除需分三步:剥离、过滤、还原
Sublime 没有语法树解析能力,只能靠策略降低风险:
• 先用 <script>]*>[\s\S]*?</script> 查找所有完整脚本块(含属性),勾选 . matches newline
• 替换时不要直接留空,而是先替换成唯一标记,比如 __SCRIPT_BLOCK_123__(用 Sublime 的「Replace All」+「Find All」配合编号插件可生成递增 ID)
• 再对这些标记做人工抽检:打开「Find All」面板,扫一眼上下文是否真为 JS 逻辑;若发现 JSON 或模板字符串混入,就手动跳过该处替换
• 最后统一把 __SCRIPT_BLOCK_* 替换为空
遇到 <script></script> 在注释或 CDATA 里怎么办
原始 HTML 若含类似结构:<!-- <script>alert(1)</script> -->
或:...]]>
上面的正则会把它当真实脚本删掉,造成语义错乱。
正确做法是:
• 先运行一次 <!--[\s\S]*?-->(勾选跨行)清除所有 HTML 注释
• 再运行 清除 CDATA 块(注意 \[ 和 \] 要转义)
• 最后再处理 <script></script> —— 此时它只存在于 DOM 主体中,干扰项已剥离
别在「Find in Files」里批量跑脚本正则
Sublime 对跨行正则 + 多文件的组合支持极差:
• 匹配结果常漏掉首尾几行
• 遇到超长脚本块(>50KB)容易卡死或假死
• 替换后文件编码可能意外变成 UTF-8-BOM 或乱码
更稳妥的做法:
• 单文件操作,Ctrl+Shift+F 打开「Find All」确认匹配项数量和位置
• 对含动态生成脚本的页面(如 Vue/React SSR 输出),优先用浏览器 DevTools 提取纯 HTML 再处理
• 真要批量清理,改用 html5lib 或 BeautifulSoup 脚本,它们能真正理解标签嵌套层级











