gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:02:18 24 4
gpt4 key购买 nike

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

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

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

  • 返回第一组中的 URL 和第二组中的文件扩展名
  • 查找编码和解码的网址
  • 查找特定文件扩展名(即视频和音频)
  • 容忍多级文件扩展名
  • 允许网址中存在空格
  • 允许任何域(无论是安全域还是非安全域),无论是否带有“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

最后一个示例应匹配两个 URL,但不匹配 __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__ 之前的第一个 URL。 .

您可以使用正则表达式和一些部分失败的 HTML 源示例:http://regexr.com/3dbac

最佳答案

好吧,如果我们只考虑您在此处提供的示例,您可能会利用 tempered greedy token (TGT) 来否定您需要匹配的扩展名:

/((?: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})/

请参阅regex demo

模式分割:

(        # 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))[^\/] )* TGT 匹配除​​ / 以外的任何字符,且该字符不是 .mp4.mkv 等的第一个字符。文字字符序列(因为如果其模式与字符串中当前位置右侧的文本匹配,则负向前瞻将导致匹配失败。

关于javascript - 正则表达式:我还应该使用其他东西来实现我想要的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36975560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com