【问题标题】:PHP Regex - Video files direct links and YouTube linksPHP Regex - 视频文件直接链接和 YouTube 链接
【发布时间】:2018-12-02 21:22:01
【问题描述】:

我正在尝试使用 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)?\/.+

【问题讨论】:

  • 您列表中的哪些链接与正则表达式不匹配?我在 regex101 上做了一个测试,都很好匹配
  • 感谢您的回复。例如,youtu.be 不匹配
  • 稍作改动,你的表达就可以正常工作(http(s)?:\/\/|(w){3}).*\.((?:mp4)|).*(youtu(be|\.be))?(\.com)?
  • 再次感谢,不幸的是,根据 regex101 这将匹配错误的 *.mp3 文件。

标签: php regex youtube mp4


【解决方案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”。在条件(前瞻)之后,我们只匹配模式的其余部分。

【讨论】:

  • 这似乎是最好的正则表达式。做了一些测试,根据 regex101 到目前为止没有误报。非常感谢!所以接下来我要做的就是将此正则表达式回显到HTML 文本输入模式属性中。但是一旦我提交了这个 HTML 表单,任何链接似乎都是有效的。看起来这个正则表达式在 HTML 输入模式中不起作用(在离开或删除组名之后)。为了让这个正则表达式在 HTML 输入模式属性上工作,我有什么需要改变的吗?
【解决方案2】:

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

【讨论】:

  • 感谢您的回复。所以我现在在域测试之后移动了 mp4 测试,并删除了 \/.+ 字符,但现在它与任何 YouTUbe 链接都不匹配:(http(s)?:\/\/|(w){3}).*(youtu(be|.be))?(\.com)?\.(?:mp4)
  • mp4 测试应该是可选的,它前面的点也是如此。
【解决方案3】:

这是因为你错误地使用了.* 表达式,这意味着any character, between 0 and unlimited times

这就是你想要的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多