从 URL 列表中选择文件路径的正则表达式

Posted

技术标签:

【中文标题】从 URL 列表中选择文件路径的正则表达式【英文标题】:Regular Expression to select file paths from list of URL 【发布时间】:2018-11-27 15:53:24 【问题描述】:

我有一个从随机网站中提取的不同格式的 URL 列表:

http://www.w3.org/2000/svg http://www.w3.org/1999/xlink    
/bg-images/png/search-magnifying-glass.png    
http://www.boston.com/weather?p1=BGMenu_SubnavBostonGlobe.com    
http://www.w3.org/2000/svg 
http://www.w3.org/1999/xlink    
/bg-images/png/search-magnifying-glass.png http://www.w3.org/2000/svg
http://www.w3.org/1999/xlink 
/bg-images/png/bg-logo--full.png            
http://www.w3.org/2000/svg 
http://www.w3.org/1999/xlink    
/bg-images/png/bg-logo--bug.png 
https://www.bostonglobe.com    
https://www.bostonglobe.com    
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking        
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking    
http://www.w3.org/1999/xlink /bg-images/png/bg-logo-large--full.png    
http://www.boston.com/section/cars?s_campaign=bg:hp:mainnav:cars    
http://realestate.boston.com?s_campaign=bg:hp:mainnav:realestate    
http://www.w3.org/2000/svg http://www.w3.org/1999/xlink

它们都采用不同的格式(可选 http/https/www)。我需要对其进行过滤以获取任何类型的“可下载”内容,例如 *jpg、*png、*html 等。

预期输出:

/bg-images/png/search-magnifying-glass.png      
/bg-images/png/search-magnifying-glass.png 
/bg-images/png/bg-logo--full.png                
/bg-images/png/bg-logo--bug.png     
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking        
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking  (not sure about these yet just in case)  
http://www.w3.org/1999/xlink /bg-images/png/bg-logo-large--full.png    

这是我第一次尝试编写正则表达式,我想出了类似的东西: (https?/\/)?(www\.)?[-a-zA-Z0-9@:;%._\+~\/#=]2,256\.[a-z]2,4a0,1\b([-a-zA-Z0-9@:;!%_\+.,~#?&//=]*)

它输出了很多垃圾行。有什么建议吗?

【问题讨论】:

您为什么不将https://www.bostonglobe.com 视为“可下载内容”?你的标准是什么? 嗯,有很多 URI 没有后缀 *.png 或类似的。图像几乎可以是任何东西。例如,许多 REST 服务使用参数来识别图像:foo.com/image?id=123456 那是你必须从中提取数据的实际文本文件,还是在你发布它时它被劫持了? 通常您会使用修改后的 URL 验证器,并捕获路径。在这种情况下,它位于捕获组 1 中。(?m)^(?!mailto:)(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d1,2|2[0-4]\d|25[0-5]))2(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]2,)))|localhost)(?::\d2,5)?(\/[^\s]+)$ @sln 可以是任何 html 文件,不依赖于此。 【参考方案1】:

由于您的示例 Input_file 在最后一行有空格,所以我使用 sub 删除这些空格,如果它们不存在,那么您可以将其删除。能否请您尝试关注,如果这对您有帮助,请告诉我。

awk 'sub(/ *$/,"")
(/^http/||/^https/||/^www/||/^\//) && \
(/.*png$/||/.*html$/||/.*jpg$/||/BGHeader_SmartBar_Breaking$/)
'  Input_file

【讨论】:

@IgorKamalov,很酷,查看此链接如何感谢 SO ***.com/help/someone-answers 上的任何人【参考方案2】:

您需要手动检查它们,而不是从一些有问题的提要中获取一些有问题的 URL,因为 URL 通常不包含有关其内容的信息。许多存储服务使用 ID 来识别图像,而不是带有扩展名的名称。但标题确实包含以下信息:

How to get content type of a web address?

那么什么是可下载的?一切。我的意思是字面上你看到的一切都是可下载的。例如,对于图像,内容类型如下所示:

image/gif, image/png, image/jpeg, image/bmp, image/webp

对于音频/视频:

audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav

部分完整列表可在此处找到:http://htmlbook.ru/html/value/mime

至于解决方案 - 只需嗅探多个 IO 线程中的每个链接。这样,您还可以首先过滤那些需要一些身份验证、已过期或无效的内容。通常它的请求非常便宜。

【讨论】:

非常感谢您的帮助。我实际上希望为网站选择所有依赖资源。我仍在为这些建立标准。它不一定是所有东西,主要是 CSS javascript 图像和来自 JS 的东西

以上是关于从 URL 列表中选择文件路径的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 如何从列表中选择第一项

Java 正则表达式:如何匹配 URL 路径?

调整 Django URL 中的正则表达式以匹配文件路径

在 C# 中使用正则表达式从完整路径解析文件名

正则表达式从列表中选择第 n 个值,允许空值

求一个正则表达式:校验url和磁盘路径。