PHP Regex-视频文件直接链接和YouTube链接

时间:2018-06-23 18:55:30

标签: php regex youtube mp4

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

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

匹配的要求是必须匹配带有和不带有http(s)和/或www的URL。因此,例如以下链接应有效:

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)?\/.+

3 个答案:

答案 0 :(得分:1)

为什么将mp4测试放在域名测试之前?末尾必需的斜杠\/和多余的字符(.+)可以防止您的正则表达式与任何mp4链接匹配。

答案 1 :(得分:1)

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

我认为您也许可以使用a pattern like this one进行前瞻:

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

协议部分结束后,我们用(?=.*mp4$|(?:youtu\.?be)“向前看”,以查看1)字符串末尾的mp4或2)域部分看起来像“ youtube | youtu.be” 。在有条件(超前)之后,我们仅匹配模式的其余部分。

答案 2 :(得分:0)

这是因为您滥用.*表达式,这意味着any character, between 0 and unlimited times

这是您想要的:

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