【问题标题】:Validating Youtube URL using Regex使用正则表达式验证 Youtube URL
【发布时间】:2012-11-08 16:31:54
【问题描述】:

我正在尝试验证我的应用程序的 YouTube 网址。

到目前为止,我有以下内容:

// Set the youtube URL
$youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk";

if (preg_match("/((http\:\/\/){0,}(www\.){0,}(youtube\.com){1} || (youtu\.be){1}(\/watch\?v\=[^\s]){1})/", $youtube_url) == 1)
{
    echo "Valid";
else
{
    echo "Invalid";
}

我希望验证以下 Youtube 网址的变体:

  • 有和没有 http://
  • 有和没有 www。
  • 使用网址 youtube.com 和 youtu.be
  • 必须有 /watch?v=
  • 必须具有唯一的视频字符串(在上面的示例中为“vpfzjcCzdtCk”)

但是,我不认为我的逻辑是正确的,因为由于某种原因它返回 true 为:www.youtube.co/watch?v=vpfzjcCzdtCk(请注意,我用 .co 和不是.com)

【问题讨论】:

标签: php regex youtube


【解决方案1】:

请尝试:

// Set the youtube URL
$youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk";

if (preg_match("/^((http\:\/\/){0,}(www\.){0,}(youtube\.com){1}|(youtu\.be){1}(\/watch\?v\=[^\s]){1})$/", $youtube_url) == 1)
{
    echo "Valid";
}
else
{
    echo "Invalid";
}

你有||在任何情况下没有 ^$ 都可以。

【讨论】:

    【解决方案2】:

    应该这样做:

    $valid = preg_match("/^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/watch\?v\=\w+$/", $youtube_url);
    if ($valid) {
        echo "Valid";
    } else {
        echo "Invalid";
    }
    

    【讨论】:

      【解决方案3】:

      在你的这个正则表达式中有很多冗余(还有leaning toothpick syndrome)。不过,这应该会产生结果:

      $rx = '~
        ^(?:https?://)?                           # Optional protocol
         (?:www[.])?                              # Optional sub-domain
         (?:youtube[.]com/watch[?]v=|youtu[.]be/) # Mandatory domain name (w/ query string in .com)
         ([^&]{11})                               # Video id of 11 characters as capture group 1
          ~x';
      
      $has_match = preg_match($rx, $url, $matches);
      
      // if matching succeeded, $matches[1] would contain the video ID
      

      一些注意事项:

      • 使用波浪符~ 作为分隔符,避免 LTS
      • 使用[.] 代替\. 以提高视觉易读性并避免LTS。 (“特殊”字符 - 例如点 . - 在字符类中无效(在方括号内))
      • 要使正则表达式更具“可读性”,您可以使用x 修饰符(它具有进一步的含义;请参阅the docs on Pattern modifiers),它还允许在正则表达式中使用 cmets
      • 可以使用非捕获组抑制捕获:(?: <pattern> )。这使表达式更有效。

      或者,要从(或多或少完整的)URL 中提取值,您可能需要使用parse_url()

      $url = 'http://youtube.com/watch?v=VIDEOID';
      $parts = parse_url($url);
      print_r($parts);
      

      输出:

      Array
      (
          [scheme] => http
          [host] => youtube.com
          [path] => /watch
          [query] => v=VIDEOID
      )
      

      验证域名和提取视频 ID 留给读者作为练习。


      我屈服于下面的评论战;感谢 Toni Oriol,正则表达式现在也适用于短 (youtu.be) URL。

      【讨论】:

      • 哇,这是一个了不起的答案。我认为需要查看手册才能准确解释我工作的原因,但这简直太棒了!谢谢!
      • 如何使用文本框验证 youtube 链接 - stackoverflow.com/questions/28735459/…
      • 不验证以下网址 youtu.be/pmpqdwvzzzm
      • @muaaz 这就是这个答案的“第 2 部分”的全部内容。视频 ID 应该是结果数组的 path 部分。你读过这个答案吗?
      • 没错@Toskan,这正是我建议的编辑的样子:)
      【解决方案4】:

      正则表达式的替代方法是parse_url()

       $parts = parse_url($url);
       if ($parts['host'] == 'youtube.com' && ...) {
         // your code
       }
      

      虽然代码更多,但可读性更高,因此更易于维护。

      【讨论】:

        【解决方案5】:

        我遵循此页面上的其他答案来解析 URL 语法,但对于 YouTube ID 值本身,您可以更具体一点,正如我在以下答案中所述StackExchange/WebApps

        Format for ID of YouTube video   -    https://webapps.stackexchange.com/a/101153/141734


        视频 ID

        对于 videoId,它是一个 8 字节(64 位)整数。将 Base64 编码应用于 8 个字节的数据需要 11 个字符。但是,由于每个 Base64 字符正好传达 6 位,因此该分配实际上可以容纳 11 × 6 = 66 位——比我们的有效负载需要的多出 2 位。多余的位设置为零,这具有排除某些字符出现在编码字符串的最后位置的效果。特别是,videoId 将始终以下列之一结尾:

        { A, E, I, M, Q, U, Y, c, g, k, o, s, w, 0, 4, 8 }
        

        因此,videoId 的正则表达式 (RegEx) 如下:

        [-_A-Za-z0-9]{10}[AEIMQUYcgkosw048]
        

        频道或播放列表 ID

        channelIdplaylistId 字符串是通过 Base64 编码 128 位(16 字节)二进制整数生成的。同样在这里,每个 Base64 的计算正确地预测了观察到的 22 个字符的字符串长度。在这种情况下,输出能够编码22 × 6 = 132位,剩余4位;这些零最终限制了 64 个字母符号中的大多数出现在最后一个位置,只有 4 个仍然符合条件。所有 channelId 字符串都以下列之一结尾:

        { A, Q, g, w }
        

        这为我们提供了 channelId 的正则表达式:

        [-_A-Za-z0-9]{21}[AQgw]
        

        【讨论】:

        猜你喜欢
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多