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".在条件(前瞻)之后,我们只匹配模式的其余部分。
我正在尝试创建一个正则表达式,它应该匹配 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".在条件(前瞻)之后,我们只匹配模式的其余部分。