sublime不能解析html,但用正则提取href/src等链接属性高效可行;需避开script、注释、不闭合引号三类坑,推荐模式:href=(["'])(1*)\1,支持单双引号严格匹配,安全不跨标签。"' ↩

直接说结论:Sublime 不能“解析 HTML”,但用正则提取 href、src 等链接属性是高效且可行的——前提是 HTML 格式基本合规,且你避开 script、注释、不闭合引号这三类坑。
怎么写一个能真正抓到链接的正则?
别用 href="(.*?)" 这种看似简单实则危险的写法。它会在换行、嵌套引号或注释里崩掉,还容易跨标签匹配。
推荐这个模式:href=(["'])([^"']*)\1
-
(["'])捕获开头引号(单或双),\1强制结尾用同一种引号闭合,防误吞 -
([^"']*)匹配引号内任意非引号字符,比.*?更安全,不跨标签 - HTML5 允许无引号写法(如
href=/path),这种正则会漏掉;若必须支持,得加分支,但代价是精度下降,一般不建议
为什么替换后多了引号或抽出了 javascript:void(0)?
这不是正则写错了,而是没过滤上下文。Sublime 不区分 <a href="..."></a> 和 <script>href="..."</script>,它只认文本。
- 先手动折叠或删掉
<script></script>和<!-- -->块(Ctrl+Shift+P→ 输入Fold Tags) - 用
<!--[\s\S]*?-->先全选注释内容,按Esc跳过不处理 - 替换完再补一刀过滤:搜索
^(?!https?://|#|javascript:|mailto:),把非外链行全删(注意勾选^$ matches newline)
怎么一次提取 href、src、data-url?
可以合并写,但分组编号会变,容易搞混。更稳的做法是分批处理,或用带命名捕获的结构(Sublime 支持 ${1},但不支持 (?P<name>)</name>)。
- 多属性通用写法:
(href|src|data-url)=(["'])([^"']*)\2,URL 在$3,不是$2 -
srcset是逗号分隔列表,不能直接套用;得先匹配整行:srcset\s*=\s*["']([^"']*)["'],再对$1手动拆分 - 图片地址想筛掉相对路径?在查找里加协议前缀约束:
href=(["'])(https?://|//)[^"']*\1
大文件卡住、匹配结果错位,问题出在哪?
正则本身没问题,是作用域和性能设置被忽略了。
- 默认正则对整个文件生效。如果只想处理网页正文部分,先手动选中
...再按Ctrl+H,面板左下角出现In Selection提示才安全 - 大文件(>5MB)建议先删掉
<script></script>、<style></style>、<noscript></noscript>块,再跑正则,速度提升明显 - 替换后粘贴到新文件时,若出现乱码,大概率是源文件编码为 GBK 或 UTF-8 with BOM,而 Sublime 新建文件默认 UTF-8;保存前点右下角编码名 →
Convert to UTF-8
最常被跳过的其实是“是否真需要所有链接”——很多 href="#top"、href="tel:123"、src="data:image/png;base64,..." 并不是你要的“可访问 URL”。提取完务必人工抽检几条,比调十遍正则更省时间。











