使用正则表达式验证 Youtube URL

2022-08-30 21:39:28

我正在尝试验证我的应用程序的 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。
  • 使用 url youtube.com 和 youtu.be
  • 必须有 /watch?v=
  • 必须具有唯一的视频字符串(在上面的示例中,“vpfzjcCzdtCk”)

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


答案 1

在你的正则表达式中有很多冗余(还有,倾斜牙签综合征)。但是,这应该会产生结果:

$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
  • 可以使用非捕获组来抑制捕获:。这使得表达式更有效。(?: <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。


答案 2

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

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

虽然它有更多的代码,但它更具可读性,因此更易于维护。


推荐