正则表达式:我还应该用其他东西来实现我想要的东西吗?

时间:2016-05-02 05:33:27

标签: javascript regex file-extension

基于搜索的大量示例,我创建了一个正则表达式,我使用(作为后备)来解析来自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返回的内容。)

如果没有更好的建议,有人可以帮我修复正则表达式来实现我想要的吗?

正则表达式应遵循以下准则:

  • 返回第一组中的网址和第二组中的文件扩展名
  • 查找已编码和已解码的网址
  • 查找特定文件扩展名(即视频和音频)
  • 容忍多级文件扩展名
  • 容忍网址
  • 中的空格
  • 允许任何域安全和非安全,有或没有“www”用于HTTP方案
  • 查找所有网址,无论其在HTML源代码中的位置如何
  • 与JavaScript兼容

匹配的一些示例:

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

1 个答案:

答案 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))[^\/])*/等文字字符序列的第一个字符(作为否定前瞻)如果匹配的模式匹配字符串中当前位置右侧的文本,则匹配失败。