sublime text批量提取href链接需用正则href=(["'])([^"']*)\1,捕获引号类型并强制闭合,避免跨标签误匹配;须先折叠script/style、跳过注释,再用^(?!https?://|#|javascript:|mailto:).*$过滤无效值,最后手动复制$2纯url。

Sublime Text 没有“一键提取超链接”的功能,所谓“一键”其实是 Find All + 正确正则 + 手动复制的组合操作;核心不是按钮,而是正则写对、范围控严、分组取准。
怎么写一个真正能抓到 href 链接的正则?
别用 href="(.+?)" 或 href='(.+?)'——它们不兼容单双引号混用,且遇到换行或嵌套引号就崩。最稳的是:href=(["'])([^"']*)\1。
-
(["'])捕获开头引号类型(单或双),\1强制结尾必须用同一种引号闭合,避免跨标签误吞 -
([^"']*)匹配引号内任意非引号字符,比.*?更安全,天然拒绝贪婪跨行 - HTML5 允许无引号写法(如
href=/path),但强行兼容会大幅增加误匹配风险,一般不建议 - 必须用括号把 URL 部分包住,否则
Find All后复制出来的是整个href="xxx",不是纯链接
为什么复制出来多了引号或抽出了 javascript:void(0)?
这不是正则错了,是 Sublime 不区分上下文——它眼里只有文本,<script>href="fake"</script> 和真实链接一样被匹配。
- 先按
Ctrl+Shift+P输入Fold Tags,折叠所有<script></script>和<style></style>块(折叠后不参与查找) - 用
<!--[\s\S]*?-->查找全部注释,按Esc跳过不处理 - 替换后若仍有无效值,再跑一轮过滤正则:
^(?!https?://|#|javascript:|mailto:).*$,勾选. matches newline,全选后删掉 - 注意:有些页面在
console.log('href="xxx"')里埋了干扰字符串,不清理就会混进结果
如何同时提取 src、data-src 等其他链接属性?
不能直接复用 href 正则,得改关键字;多属性合并时分组编号会变,容易搞错目标位置。
- 单独提取
src:用src=(["'])([^"']*)\1,URL 在$2 - 一次扫多个属性:
(href|src|data-src)=(["'])([^"']*)\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=算链接、哪些只是字符串——每次提取前花 10 秒扫一眼源码结构,比后期清洗省半小时











