sublime中用正则提取url必须锚定href/src属性值,推荐模式:href\s*=\s*["']([^"']*)["']|src\s*=\s*["']([^"']*)["'],替换为$1$2,并确保utf-8编码、启用“.匹配换行符”及正则模式。

直接用 href\s*=\s*["']([^"']+)["']|src\s*=\s*["']([^"']+)["'] 配合替换为 $1$2,就能干净提取网页中所有真实使用的 URL,但必须确保编码为 UTF-8、勾选「正则表达式」且启用「. 匹配换行符」——否则中文路径、跨行标签、反向引用全失效。
为什么 https?://\S+ 提取的 URL 总是错的
这个正则只找“以 http 开头的连续非空白字符”,但它不管这些字符串是不是真的在 HTML 中被使用。实际网页里大量存在注释里的假链接、JS 字符串拼接、Vue 的 :href 绑定、甚至 CSS 里的 url(),都会被误抓。更糟的是,它会把 href="mailto:test@example.com" 或 href="tel:+8613800138000" 也当 URL 提出来。
真正该匹配的是 HTML 属性值本身,不是协议头。所以必须锚定在 href= 和 src= 后面的引号内容上。
- 用
https?://\S+→ 抓到一堆无效、不可点击、甚至带 HTML 实体(如&)的垃圾 - 用
href\s*=\s*["']([^"']+)["']→ 只取真实属性值,天然过滤掉注释和 JS 字符串 - 如果还想要
src(比如图片、脚本路径),就合并成href\s*=\s*["']([^"']+)["']|src\s*=\s*["']([^"']+)["'],注意分组顺序:$1是 href 的值,$2是 src 的值
替换时 $1$2 为空?三个硬性前提缺一不可
Notepad++ 的反向引用(、)不是默认生效的。常见现象是:查找能高亮,替换后却整行变空或原样不动。
- 搜索模式必须选
Regular expression(右下角勾选框),否则$1当字面量处理 - 文件编码必须是
UTF-8(菜单栏「编码」→「转为 UTF-8 编码」),否则含中文路径或%E4%BD%A0%E5%A5%BD这类编码的 URL 会断在中间 - 如果 HTML 标签跨行(比如
href=在一行,URL 在下一行),必须勾选. matches newline,否则.停在换行符前,[^"']+拿不到跨行内容
提取后怎么去重并导出纯列表
替换为 $1$2 后,每行只留一个 URL,但可能有空行、重复项、甚至空字符串(比如 href="" 或 src=" ")。
- 删空行:查找
^\s*$,替换为空(注意结尾不用写\r\n,Notepad++ 自动处理) - 删重复行:菜单栏「编辑」→「行操作」→「删除重复行」(它按整行比对,不区分大小写)
- 安全导出:别直接改原文件。先 Ctrl+H → 查找填正则,替换填
$1$2→ 点「全部替换」→ 立刻 Ctrl+Z 撤销 → 再点「全部替换」→ 勾选底部「在新文档中打开」→ 新标签页就是干净 URL 列表
相对路径、动态语法、特殊符号怎么办
这个方法提取的是原始属性值,不做语义解析。所以:
- 相对路径(如
/api/user、./img/logo.png)不会自动补https://domain.com,得人工加或后续用脚本处理 -
:href="url"(Vue)、{% url 'xxx' %}(Django)、ng-href="{{url}}"(Angular)这类绑定语法,正则完全不匹配,得另写规则或预处理 - URL 中的
&是 HTML 实体,不是真实&,提取后需手动替换&→&,否则请求会 400 - 如果要提取某类 URL 的特定段(比如只拿路径末尾的 ID),得再套一层正则,例如
https?://[^/]+/example/([^?&\s"]+),替换为$1
最易被忽略的是:跨行标签和编码不一致会让整个流程静默失败——看起来操作都做了,结果却是空的或截断的。动手前务必先用小段 HTML 测试正则是否真能高亮你想要的内容。











