使用Regex验证Youtube网址

Luk*_*uke 15 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";
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lin*_*een 34

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

$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
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 使用波形符~作为分隔符,以避免LTS
  • 使用[.]而不是\.提高视觉易读性和避免LTS.("特殊"字符 - 例如点.- 在字符类中没有任何影响(在方括号内))
  • 为了使正则表达式更具"可读性",您可以使用x修饰符(具有更多含义;请参阅模式修饰符上的文档),这也允许在正则表达式中进行注释
  • 使用非捕获组可以抑制捕获:(?: <pattern> ).这使表达式更有效.

(可选)要从(或多或少完整)URL中提取值,您可能希望使用parse_url():

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

输出:

Array
(
    [scheme] => http
    [host] => youtube.com
    [path] => /watch
    [query] => v=VIDEOID
)
Run Code Online (Sandbox Code Playgroud)

验证域名并提取视频ID是留给读者的练习.


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


Jas*_*ary 5

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

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

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