正则提取html中href、src等属性值可行,但需用href=(["'])(1*)\1等精确模式匹配引号内内容,并预处理折叠script/style、删除注释,再过滤非法协议与相对路径,最后锚定行边界导出整行url。"' ↩

直接用正则提取 HTML 中的 href、src 等属性值是可行的,但必须加引号匹配和边界控制,否则会抽到注释、JS 字符串甚至跨标签内容——这不是正则不行,是你没告诉它“别乱跑”。
匹配 href 和 src 链接时,为什么总多出引号或截断?
常见错误现象:https://example.com"(末尾多一个引号)、javascript:void(0) 被抽中、href="//cdn.example.com" 漏掉协议。
根本原因是用了过于宽松的模式,比如 href="(.*)" 或 href='(.*)':
-
.*是贪婪匹配,遇到换行或后续引号就容易吞过头 - 没统一处理单双引号,导致一种引号能匹配,另一种漏掉
- 没排除注释块和
<script></script>内容,它们也含href=字样
正确写法:href=(["'])([^"']*)\1
说明:(["']) 捕获开头引号类型,\1 强制闭合用同种引号,[^"']* 限定只取引号内非引号字符,天然防跨标签。
替换时填 $2(注意不是 $1),就能干净抽出 URL。
怎么跳过 script、style 和注释里的伪链接?
Sublime 不解析 DOM,没法“知道”某段 href= 是不是真实链接。你得手动清场:
- 先按
Ctrl+Shift+P输入Fold Tags,折叠所有<script></script>、<style></style>块(折叠后它们不参与查找) - 用
<!--[\s\S]*?-->查找所有注释,Enter跳过不替换(或全选后Ctrl+X剪切暂存) - 若只想留有效外链,替换完再补一招:
^(?!https?://|//|#|javascript:|mailto:).*$,查出并删掉所有不以合法协议/锚点开头的行
这步不能省——很多页面在 console.log('href="xxx"') 里埋了干扰字符串,不清理就会混进结果。
提取图片链接时,如何只抓真实可访问的 URL?
光匹配 src= 不够,相对路径(如 ./img/logo.png)无法直接打开,且可能夹带 JS 变量或 base64。
推荐这个更严的模式:src\s*=\s*["']((?:https?://|//)[^"'\s>]+?\.(?:png|jpe?g|gif|webp|svg)[^"'\s>]*)["']
关键点:
-
src\s*=\s*容忍等号前后空格和换行 -
(?:https?://|//)锁定协议或协议相对 URL,排除data:image/和./类路径 -
\.(?:png|jpe?g|gif|webp|svg)强制结尾为图片后缀(jpe?g同时覆盖jpg和jpeg) - 整个 URL 放在第一个捕获组,替换用
$1即可
如果页面图片后缀大小写混用(如 .JPG),开头加 (?i) 标志即可,不用改后缀列表。
批量提取后,为什么复制出来全是碎片而不是整行?
因为默认 Find All 只选中匹配文本本身,不是整行。想导出为干净列表,必须让正则“包住整行”:
- 查找框填:
^.*href=(["'])([^"']*)\1.*$(开头^+ 结尾$) - 点
Find All,再按Ctrl+Alt+G(Win/Linux)或Ctrl+Cmd+G(macOS)全选所有匹配行 -
Ctrl+C复制,Ctrl+N新建文件粘贴,就得到每行一个 URL 的纯文本
这一步最容易被跳过——很多人复制后发现内容错位、换行丢失,其实是没锚定行边界。另外,Find in Files(Ctrl+Shift+F)同样适用此逻辑,适合扫整个项目目录下的 HTML 文件。
真正麻烦的从来不是正则怎么写,而是你有没有在点 Replace All 前,确认右下角显示的匹配数合理、且预览了前 3 条结果是否真符合预期。











