sublime正则提取href链接易出错,因默认模式href="(.?)"不识别html结构,跨行、嵌套引号或注释中会失效;安全写法为href=(["'])(1)\1,需勾选.*模式并预处理script/style/注释,再二次过滤无效协议。"' ↩

Sublime里用正则提取href链接,为什么总多出引号或截断?
因为默认正则 href="(.*?)" 在换行、嵌套引号或注释中会失效——它不识别 HTML 结构,只按字符匹配。一旦 href 值跨行,或页面里有 href="javascript:void(0)"、href="#" 甚至注释里的 <!-- href="fake.com" -->,就会抽错。
真正安全的写法是:href=(["'])([^"']*)\1
-
(["'])捕获开头单/双引号,\1强制结尾用同一种引号闭合,避免跨标签“吃掉”后面内容 -
([^"']*)只匹配非引号字符,比.*?更精准,防贪婪匹配 - 必须勾选 Sublime 的
.*(正则模式)和Match case(通常可不勾,除非大小写敏感)
怎么跳过 script/style/注释里的伪链接?
Sublime 不解析 DOM,没法“知道”某段 href= 是在 <script></script> 里还是真实链接。只能靠人工预处理或分步过滤。
- 先折叠干扰块:按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Fold Tags,回车 → 快速收起所有<script></script>、<style></style>、<noscript></noscript>块 - 再手动删或跳过注释:用查找
<!--[\s\S]*?-->全选注释段,按Esc取消选中,避免误替换 - 提取后二次清洗:再开一个替换面板,查找
^(#|javascript:|mailto:),替换成空,批量剔除无效协议
想同时抓 src、data-url、content 这些非 href 链接怎么办?
结构一致,只是属性名不同。硬编码多个正则太累,用分组复用更稳。
例如提取 src 和 data-url:(src|data-url)=(["'])([^"']*)\2
- URL 实际在
$3(不是$2),因为(src|data-url)占了第一组,(["'])是第二组 - 如果还要加
href,写成(href|src|data-url)=(["'])([^"']*)\2,URL 仍在$3 -
srcset不能直接套用——它是逗号分隔列表,得先用srcset=["']([^"']*)["']提整段,再用 Python 或 Excel 拆分
大文件卡顿、结果乱码、导出后格式错乱怎么解?
Sublime 对超大 HTML(>10MB)或含 BOM/混合编码的源码处理吃力,不是正则写得不对,是编辑器本身瓶颈。
- 提前裁剪:用浏览器开发者工具复制
内容,或用命令行sed -n '//,//p' page.html > body.html截取主体 - 编码确认:右下角看状态栏是否显示
UTF-8;若显示Western (ISO 8859-1),点它 →Reopen with Encoding→ 选UTF-8 - 导出别偷懒:Sublime 替换后结果是纯文本,需手动
Ctrl+A→Ctrl+C→ 粘到 Excel;若列错位,粘入时选 Excel 的“选择性粘贴→文本”,再用“数据→分列”按 Tab 拆
真正麻烦的从来不是正则本身,而是你没意识到 HTML 是树状结构,而正则只是扁平字符串扫描——它永远不知道哪个 href 属于哪个 <a></a>,也不知道 <meta http-equiv="refresh"> 里藏的跳转算不算“链接”。这点,得靠人来判断边界。











