基于搜索的大量示例,我创建了一个正则表达式,我使用(作为后备)来解析来自HTML源的直接文件链接:
/((?:(?:https?%3A%2F%2F)(?:www\.)?(?:\S+)%2F|(?:https?:\/\/)(?:www\.)?(?:\S+)\/)(?:.*)?\.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)(?=[^.]*$))/igm
我的问题是它在包含多个链接的行上失败。我知道使用正则表达式解析HTML即使作为后备也是不受欢迎的,我还能用什么来查找页面源中的所有直接文件链接? (这意味着隐藏在内联JavaScript,视频源代码等中的链接;而不仅仅是document.links
返回的内容。)
如果没有更好的建议,有人可以帮我修复正则表达式来实现我想要的吗?
正则表达式应遵循以下准则:
应匹配的一些示例:
http://test.com/test.mkv
http://test.com/test/test.jpg.mkv
https://test.com/test.mkv?test=test
http%3A%2F%2Ftest.com%2Ftest.mkv%3Ftest%3Dtest
https%3A%2F%2Ftest.com%2Ftest.jpg.mkv%3Ftest%3Dtest.mkv
http://test.com/t est.mkv__some__random__string__http://test.com/test.mkv
最后一个示例应与两个网址匹配,但不是__some__random__string__
。
不应匹配的一些示例:
http://test.com/test.mkv.jpg
http://test.com/test.mkv/test.jpg
https://test.com/test.mkv.jpg?test=test.mkv
http%3A%2F%2Ftest.com%2Ftest.mkv.jpg
https%3A%2F%2Ftest.com%2Ftest.mkv.jpg%3Ftest%3Dtest.mkv
http://test.com/t est.mkv__some__random__string__http://test.com/test.mkv.jpg
最后一个示例应仅匹配__some__random__string__
之前的第一个网址。
你可以使用正则表达式和一些部分失败的HTML源代码示例:http://regexr.com/3dbac
答案 0 :(得分:0)
好吧,如果我们只考虑您在此处提供的示例,您可以利用tempered greedy token(TGT)来取消您需要匹配的扩展程序:
awk '/pattern/{print FILENAME; cnt++; nextfile} END{print cnt+0}' $(find D:/Temp -type f -name "file.txt")
请参阅regex demo
模式细分:
nextfile
/((?:https?(?:%3A%2F%2F|:\/\/))(?:www\.)?(?:\S+)(?:%2F|\/)(?:(?!\.(?:mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg))[^\/])*\.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg))(?!\/|\.[a-z]{1,3})/
TGT匹配( # Group 1 matching the whole URL
(?:https?(?:%3A%2F%2F|:\/\/))(?:www\.)?(?:\S+)(?:%2F|\/) # Matching URL part with no spaces up to the last /
(?:(?!\.(?:mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg))[^\/])* # TGT matching up to the extension
\.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg) # The extension
)
(?!\/|\.[a-z]{1,3}) # Only if not followed with /, or another extension
以外的任何字符,该字符不是(?:(?!\.(?:mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg))[^\/])*
,/
等文字字符序列的第一个字符(作为否定前瞻)如果匹配的模式匹配字符串中当前位置右侧的文本,则匹配失败。