PHP 正则表达式 - 视频文件直接链接和 YouTube 链接

PHP Regex - Video files direct links and YouTube links

我正在尝试创建一个正则表达式,它应该匹配 URL 直接指向 *.mp4 文件 YouTube 视频,使用 PHP.

我已经成功创建了一个仅匹配 YouTube 视频的正则表达式和另一个仅匹配直接 *.mp4 文件的正则表达式,现在我想将它们组合起来,目前失败了。

匹配的要求是它必须匹配 URL 有和没有 http(s) and/or www。因此,例如以下链接应该是有效的:

https://www.example.com/files/video.mp4
http://www.example.com/files/video.mp4
https://example.com/files/video.mp4
http://example.com/files/video.mp4
www.example.com/files/video.mp4
www.youtube.com/watch?v=xxxxxx
www.youtu.be/watch?v=xxxxxx

我正在使用 regex101.com 进行测试和解释。目前根据这个测试网站,有些链接是有效的,有些链接是错误的,但实际上应该是正确的。

有人可以告诉我 my regex 有什么问题吗?

(http(s)?:\/\/|(w){3}).*\.((?:mp4)|).*(youtu(be|.be))?(\.com)?\/.+

为什么要把mp4测试放在域名测试之前?所需的斜杠 \/ 和末尾的额外字符 (.+) 会阻止您的正则表达式匹配任何 mp4 链接。

这是因为你用错了.*表达式,意思是any character, between 0 and unlimited times.

这是你想要的:

(https?\:\/\/)?(www\.)?(((youtube\.com|youtu\.?be)\/.+)|([\w\/\.]*\.mp4))

正如 blhsing 指出的那样,它是防止模式(错误地)匹配所有 url 的最后一个正斜杠。问题是,一旦您将最后一个斜杠设为可选,该模式将匹配任何 url,因为您所有的检查都只是那些 .* 通配符之后的可选部分,这些通配符已经匹配到字符串的末尾. (example showing these false positives)

我想你也许可以利用 a pattern like this one:

的前瞻
(?<protocol>https?:\/\/(www\.)?|www\.)(?=.*mp4$|(?:youtu\.?be))(?<url>.*)

协议部分完成后,我们 "look ahead" 和 (?=.*mp4$|(?:youtu\.?be) 可以看到 1) mp4 在字符串末尾或 2) 域部分看起来像 "youtube|youtu.be".在条件(前瞻)之后,我们只匹配模式的其余部分。