php - 使用正则表达式验证 Youtube URL

标签 php regex youtube

我正在尝试为我的应用程序验证 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 for: www.youtube.co/watch?v=vpfzjcCzdtCk(注意我用 .co 而不是 .com 写错了)

最佳答案

您的这个正则表达式(以及 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 ),它还允许在正则表达式中进行注释
  • 可以使用非捕获组来抑制捕获:(?: <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。

关于php - 使用正则表达式验证 Youtube URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476060/

相关文章:

regex - AWK,如果特定列的模式匹配则拆分文件中的内容

jquery - 如何在jQuery中加载YouTube视频?

php - 如果用户使用 php 登录,如何仅使页面可访问

PHP 5.3 自动从表单字符串中转义 $_GET/$_POST?

javascript - 翻转匹配子串

java - 错误的拆分字符串(拆分 (""))

google-chrome - Chrome应用内容安全政策问题

javascript - 为什么 YouTube JavaScript Player API 打开与我的代码中的 URL 不同的 URL,并且只播放播放列表的第一个视频?

php - Datatables postgres重复行分页

php - 获取 502、504 高 CPU 使用率。 Wordpress 仪表板太慢