我正在尝试创建一个正则表达式,该正则表达式应与使用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)?\/.+
答案 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))