Youtube I.D解析新的URL格式

时间:2011-10-07 21:52:35

标签: php regex youtube format

之前已经问过这个问题,我发现了这个问题:

Reg exp for youtube link

但我正在寻找一些略有不同的东西。

我需要匹配Youtube I.D本身与所有可能的youtube链接格式兼容。不仅仅是从youtube.com开始。

例如:

http://www.youtube.com/watch?v=-wtIMTCHWuI

http://www.youtube.com/v/-wtIMTCHWuI?version=3&autohide=1

http://youtu.be/-wtIMTCHWuI

http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3D-wtIMTCHWuI&format=json

http://s.ytimg.com/yt/favicon-wtIMTCHWuI.ico

http://i2.ytimg.com/vi/-wtIMTCHWuI/hqdefault.jpg

是否有一个聪明的策略可用于匹配与所有这些格式兼容的视频I.D -wtIMTCHWuI。我在考虑字符统计和匹配= ? / . &个字符。

5 个答案:

答案 0 :(得分:49)

我必须为几周前编写的PHP类处理这个问题,最后得到一个匹配任何类型字符串的正则表达式:有或没有URL方案,有或没有子域,youtube.com URL字符串,youtu .be URL字符串并处理所有类型的参数排序。您可以查看at GitHub或只是复制并粘贴下面的代码块:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */
function parse_yturl($url)
{
    $pattern = '#^(?:https?://|//)?(?:www\.|m\.)?(?:youtu\.be/|youtube\.com/(?:embed/|v/|watch\?v=|watch\?.+&v=))([\w-]{11})(?![\w-])#';
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}

测试用例:https://3v4l.org/GEDT0
JavaScript版本:https://stackoverflow.com/a/10315969/624466

要解释正则表达式,这是一个拆分版本:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */
function parse_yturl($url)
{
    $pattern = '#^(?:https?://|//)?' # Optional URL scheme. Either http, or https, or protocol-relative.
             . '(?:www\.|m\.)?'      #  Optional www or m subdomain.
             . '(?:'                 #  Group host alternatives:
             .   'youtu\.be/'        #    Either youtu.be,
             .   '|youtube\.com/'    #    or youtube.com
             .     '(?:'             #    Group path alternatives:
             .       'embed/'        #      Either /embed/,
             .       '|v/'           #      or /v/,
             .       '|watch\?v='    #      or /watch?v=,
             .       '|watch\?.+&v=' #      or /watch?other_param&v=
             .     ')'               #    End path alternatives.
             . ')'                   #  End host alternatives.
             . '([\w-]{11})'         # 11 characters (Length of Youtube video ids).
             . '(?![\w-])#';         # Rejects if overlong id.
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}

答案 1 :(得分:3)

我找到了这段代码this link

<?php 
/** 
 *  parse_youtube_url() PHP function 
 *  Author: takien 
 *  URL: http://takien.com 
 *  
 *  @param  string  $url    URL to be parsed, eg:  
 *                            http://youtu.be/zc0s358b3Ys,  
 *                            http://www.youtube.com/embed/zc0s358b3Ys
 *                            http://www.youtube.com/watch?v=zc0s358b3Ys 
 *  @param  string  $return what to return 
 *                            - embed, return embed code 
 *                            - thumb, return URL to thumbnail image
 *                            - hqthumb, return URL to high quality thumbnail image.
 *  @param  string     $width  width of embeded video, default 560
 *  @param  string  $height height of embeded video, default 349
 *  @param  string  $rel    whether embeded video to show related video after play or not.

 */  

 function parse_youtube_url($url,$return='embed',$width='',$height='',$rel=0){ 
    $urls = parse_url($url); 

    //expect url is http://youtu.be/abcd, where abcd is video iD
    if($urls['host'] == 'youtu.be'){  
        $id = ltrim($urls['path'],'/'); 
    } 
    //expect  url is http://www.youtube.com/embed/abcd 
    else if(strpos($urls['path'],'embed') == 1){  
        $id = end(explode('/',$urls['path'])); 
    } 
     //expect url is abcd only 
    else if(strpos($url,'/')===false){ 
        $id = $url; 
    } 
    //expect url is http://www.youtube.com/watch?v=abcd 
    else{ 
        parse_str($urls['query']); 
        $id = $v; 
    } 
    //return embed iframe 
    if($return == 'embed'){ 
        return '<iframe width="'.($width?$width:560).'" height="'.($height?$height:349).'" src="http://www.youtube.com/embed/'.$id.'?rel='.$rel.'" frameborder="0" allowfullscreen>'; 
    } 
    //return normal thumb 
    else if($return == 'thumb'){ 
        return 'http://i1.ytimg.com/vi/'.$id.'/default.jpg'; 
    } 
    //return hqthumb 
    else if($return == 'hqthumb'){ 
        return 'http://i1.ytimg.com/vi/'.$id.'/hqdefault.jpg'; 
    } 
    // else return id 
    else{ 
        return $id; 
    } 
} 
?>

我也在处理这个问题,如果你找到更好的解决方案,请告诉我。它并不能完全满足您对开箱即用图像的需求,但它可以很容易地进行调整。

答案 2 :(得分:0)

目前我正在使用它:

function _getYoutubeVideoId($url)
{
  $parts = parse_url($url);

  //For seriously malformed urls
  if ($parts === false) {
     return false;
  }

  switch ($parts['host']) {
     case 'youtu.be':
        return substr($parts['path'], 1);
        break;
     case 'youtube.com':
     case 'www.youtube.com':
        parse_str($parts['query'], $params);
        return $params['v'];
        break;
     default:
        return false;
        break;
  } 
}

它可以扩展,但现在它适用于大多数情况

答案 3 :(得分:0)

有点晚了,但是我今天写了这个正则表达式,它不仅识别链接,而且还通过匹配组6返回video_id

^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)(\/)?(watch\?v=|\?v=)?(.*)$

https://gist.github.com/Shibizle/3c6707911ea716860786728d31f8e3e5

对其进行测试: https://regex101.com/r/l0m7yh/1

图片Regex YouTube

答案 4 :(得分:0)

我不知道这是否是您要寻找的东西,但是我找到了这个很棒的YouTube URL(GitHub)列表。

列表中的某些URL用于代理服务和归因链接。在我的用例中,提供的字符串可以是URL或只是ID-因此正则表达式匹配不会。

因此,基于此处的所有可能性,可以使用两个正则表达式替换来提取ID:

^.+(\/|vi?=|v%3D)

在所有采样情况下,这将选择字符串开头和ID开头之间的所有内容。这是一个演示RegExr

[^a-zA-Z0-9_\-].+$

此外,在所有采样的情况下,这会选择从ID的末尾(在现在的截断的字符串中)到字符串末尾的所有内容。 这是一个演示RegExr