求适用于Notepad++/Regex101的正则表达式:仅保留链接
从代码中提取纯HTTP/HTTPS链接的解决方案
问题说明
需要从一段包含HTTP/HTTPS链接的代码中提取所有纯链接,最终输出每行一个链接的列表。现有正则https?://.*?[\s+"]能匹配链接但会附带多余符号,无法得到纯链接。
待处理代码示例:
/**/ jQuery(function($){ playerInit( 11403, 'Убийца Богов', 'json', [{"id":"0","title":" 176","url":"https://ii-z.ru/11403/176.mp3","error":0,"duration":909,"duration_min":"15:09"},{"id":"1","title":" 177","url":"https://ii-z.ru/11403/177.mp3","error":0,"duration":850,"duration_min":"14:10"},{"id":"2","title":" 178","url":"https://ii-z.ru/11403/178.mp3","error":0,"duration":800,"duration_min":"13:20"},{"id":"3","title":" 179","url":"https://ii-z.ru/11403/179.mp3","error":0,"duration":834,"duration_min":"13:54"},{"id":"4","title":" 180","url":"https://ii-z.ru/11403/180.mp3","error":0,"duration":898,"duration_min":"14:58"},{"id":"5","title":" 181","url":"https://ii-z.ru/11403/181.mp3","error":0,"duration":777,"duration_min":"12:57"},{"id":"6","title":" 182","url":"https://ii-z.ru/11403/182.mp3","error":0,"duration":832,"duration_min":"13:52"},{"id":"7","title":" 183","url":"https://ii-z.ru/11403/183.mp3","error":0,"duration":827,"duration_min":"13:47"},{"id":"8","title":" 184","url":"https://ii-z.ru/11403/184.mp3","error":0,"duration":837,"duration_min":"13:57"},{"id":"9","title":" 185","url":"https://ii-z.ru/11403/185.mp3","error":0,"duration":809,"duration_min":"13:29"},{"id":"10","title":" 186","url":"https://ii-z.ru/11403/186.mp3","error":0,"duration":853,"duration_min":"14:13"},{"id":"11","title":" 187","url":"https://ii-z.ru/11403/187.mp3","error":0,"duration":860,"duration_min":"14:20"},{"id":"12","title":" 188","url":"https://ii-z.ru/11403/188.mp3","error":0,"duration":881,"duration_min":"14:41"},{"id":"13","title":" 189","url":"https://ii-z.ru/11403/189.mp3","error":0,"duration":815,"duration_min":"13:35"},{"id":"14","title":" 190","url":"https://ii-z.ru/11403/190.mp3","error":0,"duration":720,"duration_min":"12:00"},{"id":"15","title":" 191","url":"https://ii-z.ru/11403/191.mp3","error":0,"duration":757,"duration_min":"12:37"},{"id":"16","title":" 192","url":"https://ii-z.ru/11403/192.mp3","error":0,"duration":873,"duration_min":"14:33"},{"id":"17","title":" 193","url":"https://ii-z.ru/11403/193.mp3","error":0,"duration":801,"duration_min":"13:21"},{"id":"18","title":" 194","url":"https://ii-z.ru/11403/194.mp3","error":0,"duration":902,"duration_min":"15:02"},{"id":"19","title":" 195","url":"https://ii-z.ru/11403/195.mp3","error":0,"duration":830,"duration_min":"13:50"},{"id":"20","title":" 196","url":"https://ii-z.ru/11403/196.mp3","error":0,"duration":820,"duration_min":"13:40"},{"id":"21","title":" 197","url":"https://ii-z.ru/11403/197.mp3","error":0,"duration":968,"duration_min":"16:08"},{"id":"22","title":" 198","url":"https://ii-z.ru/11403/198.mp3","error":0,"duration":790,"duration_min":"13:10"},{"id":"23","title":" 199","url":"https://ii-z.ru/11403/199.mp3","error":0,"duration":790,"duration_min":"13:10"}], 'https://audiokniga.one/uploads/posts/2023-11/1699047567_1-1.webp'); }); /**/
期望输出:
https://ii-z.ru/11403/176.mp3 https://ii-z.ru/11403/177.mp3 https://ii-z.ru/11403/178.mp3 ... https://audiokniga.one/uploads/posts/2023-11/1699047567_1-1.webp
解决方案
方案1:优化正则表达式
原正则https?://.*?[\s+"]采用非贪婪匹配,会把结尾的引号或空格也包含进来。可以修改为匹配直到引号或空格为止的所有非空白/非引号字符,直接得到纯链接:
https?://[^"\s]+
- 解释:
https?://:匹配HTTP或HTTPS协议头[^"\s]+:匹配任意数量的非引号、非空白字符,直到遇到引号或空格停止,刚好截断到链接末尾
使用方式:在支持全局匹配的正则工具(如VS Code查找替换、Regex101)中,开启全局匹配(g标志),提取所有匹配结果即可。
方案2:利用JSON解析(更可靠)
观察待处理代码,所有音频链接都在playerInit函数的第四个参数(一个标准JSON数组)中,还有一个图片链接在最后一个参数。用JSON解析能避免正则可能出现的误匹配,更精准:
步骤(浏览器控制台实现):
- 打开代码所在页面,打开浏览器开发者工具(F12)的Console标签
- 执行以下代码:
// 提取playerInit的参数 const initCall = document.querySelector('script').textContent.match(/playerInit\((.*?)\)/)[1]; const args = initCall.split(',').map(arg => arg.trim()); // 解析音频链接的JSON数组 const audioItems = JSON.parse(args[3]); audioItems.forEach(item => console.log(item.url)); // 提取最后一个图片链接 const imgUrl = args[args.length - 1].replace(/['"]/g, ''); console.log(imgUrl);
- 控制台会输出所有纯链接,直接复制即可。
步骤(Python实现):
import re import json # 待处理代码字符串 code = """/**/ jQuery(function($){ playerInit( 11403, 'Убийца Богов', 'json', [{"id":"0","title":" 176","url":"https://ii-z.ru/11403/176.mp3","error":0,"duration":909,"duration_min":"15:09"},{"id":"1","title":" 177","url":"https://ii-z.ru/11403/177.mp3","error":0,"duration":850,"duration_min":"14:10"},{"id":"2","title":" 178","url":"https://ii-z.ru/11403/178.mp3","error":0,"duration":800,"duration_min":"13:20"},{"id":"3","title":" 179","url":"https://ii-z.ru/11403/179.mp3","error":0,"duration":834,"duration_min":"13:54"},{"id":"4","title":" 180","url":"https://ii-z.ru/11403/180.mp3","error":0,"duration":898,"duration_min":"14:58"},{"id":"5","title":" 181","url":"https://ii-z.ru/11403/181.mp3","error":0,"duration":777,"duration_min":"12:57"},{"id":"6","title":" 182","url":"https://ii-z.ru/11403/182.mp3","error":0,"duration":832,"duration_min":"13:52"},{"id":"7","title":" 183","url":"https://ii-z.ru/11403/183.mp3","error":0,"duration":827,"duration_min":"13:47"},{"id":"8","title":" 184","url":"https://ii-z.ru/11403/184.mp3","error":0,"duration":837,"duration_min":"13:57"},{"id":"9","title":" 185","url":"https://ii-z.ru/11403/185.mp3","error":0,"duration":809,"duration_min":"13:29"},{"id":"10","title":" 186","url":"https://ii-z.ru/11403/186.mp3","error":0,"duration":853,"duration_min":"14:13"},{"id":"11","title":" 187","url":"https://ii-z.ru/11403/187.mp3","error":0,"duration":860,"duration_min":"14:20"},{"id":"12","title":" 188","url":"https://ii-z.ru/11403/188.mp3","error":0,"duration":881,"duration_min":"14:41"},{"id":"13","title":" 189","url":"https://ii-z.ru/11403/189.mp3","error":0,"duration":815,"duration_min":"13:35"},{"id":"14","title":" 190","url":"https://ii-z.ru/11403/190.mp3","error":0,"duration":720,"duration_min":"12:00"},{"id":"15","title":" 191","url":"https://ii-z.ru/11403/191.mp3","error":0,"duration":757,"duration_min":"12:37"},{"id":"16","title":" 192","url":"https://ii-z.ru/11403/192.mp3","error":0,"duration":873,"duration_min":"14:33"},{"id":"17","title":" 193","url":"https://ii-z.ru/11403/193.mp3","error":0,"duration":801,"duration_min":"13:21"},{"id":"18","title":" 194","url":"https://ii-z.ru/11403/194.mp3","error":0,"duration":902,"duration_min":"15:02"},{"id":"19","title":" 195","url":"https://ii-z.ru/11403/195.mp3","error":0,"duration":830,"duration_min":"13:50"},{"id":"20","title":" 196","url":"https://ii-z.ru/11403/196.mp3","error":0,"duration":820,"duration_min":"13:40"},{"id":"21","title":" 197","url":"https://ii-z.ru/11403/197.mp3","error":0,"duration":968,"duration_min":"16:08"},{"id":"22","title":" 198","url":"https://ii-z.ru/11403/198.mp3","error":0,"duration":790,"duration_min":"13:10"},{"id":"23","title":" 199","url":"https://ii-z.ru/11403/199.mp3","error":0,"duration":790,"duration_min":"13:10"}], 'https://audiokniga.one/uploads/posts/2023-11/1699047567_1-1.webp'); }); /**/""" # 提取JSON数组部分 json_match = re.search(r'\[(.*?)\]', code, re.DOTALL) if json_match: json_str = f"[{json_match.group(1)}]" audio_items = json.loads(json_str) # 输出所有音频链接 for item in audio_items: print(item['url']) # 提取图片链接 img_match = re.search(r"'(https?://[^']+)'", code) if img_match: print(img_match.group(1))
内容的提问来源于stack exchange,提问作者vitinnn46
相关产品推荐
相关产品推荐

