【问题标题】:getting youtube video id the PHP获取 youtube 视频 id 的 PHP
【发布时间】:2012-04-15 22:36:00
【问题描述】:

我目前正在编写一个 web 应用程序,其中一些页面严重依赖能够拉入正确的 youtube 视频并播放它。 youtube URL 由用户提供,因此通常会带有变体,其中一个可能如下所示:

http://www.youtube.com/watch?v=y40ND8kXDlg

而另一个可能看起来像这样:

http://www.youtube.com/watch/v/y40ND8kXDlg

目前我可以使用以下代码从后者中提取 ID:

function get_youtube_video_id($video_id)
{

    // Did we get a URL?
    if ( FALSE !== filter_var( $video_id, FILTER_VALIDATE_URL ) )
    {

        // http://www.youtube.com/v/abcxyz123
        if ( FALSE !== strpos( $video_id, '/v/' ) )
        {
            list( , $video_id ) = explode( '/v/', $video_id );
        }

        // http://www.youtube.com/watch?v=abcxyz123
        else
        {
            $video_query = parse_url( $video_id, PHP_URL_QUERY );
            parse_str( $video_query, $video_params );
            $video_id = $video_params['v'];
        }

    }

    return $video_id;

}

如何处理使用?v 版本而不是/v/ 版本的URL?

【问题讨论】:

标签: php url youtube get parse-url


【解决方案1】:

像这样:

$link = "http://www.youtube.com/watch?v=oHg5SJYRHA0";
$video_id = explode("?v=", $link);
$video_id = $video_id[1];

这是通用解决方案:

$link = "http://www.youtube.com/watch?v=oHg5SJYRHA0&lololo";
$video_id = explode("?v=", $link); // For videos like http://www.youtube.com/watch?v=...
if (empty($video_id[1]))
    $video_id = explode("/v/", $link); // For videos like http://www.youtube.com/watch/v/..

$video_id = explode("&", $video_id[1]); // Deleting any other params
$video_id = $video_id[0];

或者只使用这个正则表达式:

(\?v=|/v/)([-a-zA-Z0-9]+)

【讨论】:

  • 这并不总是有效。如果你从 youtube 网站复制/粘贴 url,通常还有其他参数,例如 http://www.youtube.com/watch?v=oHg5SJYRHA0&player=normal&... There can be a dozen of these. Your code will produce the ID of oHg5SJYRHA0&player=normal&...` - 这显然是错误的
  • 修复了这个问题。看看新的解决方案。
  • 或者在这里查看我的代码:github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… 它处理各种 youtube url,以及 vimeo 和 dailymotion。
【解决方案2】:
<?php
$your_url='https://www.youtube.com/embed/G_5-SqD2gtA';
function get_youtube_id_from_url($url)
{
    if (stristr($url,'youtu.be/'))
        {preg_match('/(https:|http:|)(\/\/www\.|\/\/|)(.*?)\/(.{11})/i', $url, $final_ID); return $final_ID[4]; }
    else 
        {@preg_match('/(https:|http:|):(\/\/www\.|\/\/|)(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $IDD); return $IDD[5]; }
}

echo get_youtube_id_from_url($your_url)
?>

【讨论】:

    【解决方案3】:
    <?php
    // Here is a sample of the URLs this regex matches: (there can be more content after the given URL that will be ignored)
    
    // http://youtu.be/dQw4w9WgXcQ
    // http://www.youtube.com/embed/dQw4w9WgXcQ
    // http://www.youtube.com/watch?v=dQw4w9WgXcQ
    // http://www.youtube.com/?v=dQw4w9WgXcQ
    // http://www.youtube.com/v/dQw4w9WgXcQ
    // http://www.youtube.com/e/dQw4w9WgXcQ
    // http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
    // http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
    // http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
    // http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
    
    // It also works on the youtube-nocookie.com URL with the same above options.
    // It will also pull the ID from the URL in an embed code (both iframe and object tags)
    
    preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
    $youtube_id = $match[1];
    ?>
    

    【讨论】:

      【解决方案4】:

      试试:

      
      function youtubeID($url){
           $res = explode("v",$url);
           if(isset($res[1])) {
              $res1 = explode('&',$res[1]);
              if(isset($res1[1])){
                  $res[1] = $res1[0];
              }
              $res1 = explode('#',$res[1]);
              if(isset($res1[1])){
                  $res[1] = $res1[0];
              }
           }
           return substr($res[1],1,12);
           return false;
       }
      $url = "http://www.youtube.com/watch/v/y40ND8kXDlg";
      echo youtubeID($url1);
      

      两者都适用

      【讨论】:

        【解决方案5】:

        好的,这比我以前的答案要好得多:

          $link = 'http://www.youtube.com/watch?v=oHg5SJYRHA0&player=normal';
        
          strtok($link, '?');
        
          parse_str(strtok(''));
        
          echo $v;
        

        在函数中包含 this 可能会很好,以将新变量保持在全局范围之外(除非您希望它们存在,显然)。

        【讨论】:

          【解决方案6】:

          这可能尚未使用,但可能有其他人在寻找答案,因此,从 URL 获取 YouTube ID。

          P.S:这适用于所有类型的 URL,我已经测试过了;

          Function getYouTubeID($URL){
              $YouTubeCheck = preg_match('![?&]{1}v=([^&]+)!', $URL . '&', $Data);
              If($YouTubeCheck){
                  $VideoID = $Data[1];
              }
              Return $VideoID;
          }
          

          或者只使用 preg_match 函数本身;

          If(preg_match('![?&]{1}v=([^&]+)!', $URL . '&', $Data)){
                  $VideoID = $Data[1];
          }
          

          希望这对某人有帮助:)!

          【讨论】:

            【解决方案7】:

            我知道的最简单的 YouTube 方法。

             function GetYouTubeId($url)
             {
             preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
             $youtube_id = $match[1];
             return $youtube_id;
             }
            

            【讨论】:

              【解决方案8】:
              $parts = explode('=', $link);
              
              // $parts[1] will y40ND8kXDlg
              

              此示例仅在 URL 中有一个“=”时才有效。有没有可能更多?

              【讨论】:

              【解决方案9】:

              我只会搜索最后一个“/”或最后一个“=”。在它之后,您总是会找到 video-id。

              【讨论】:

              • 这可能适用于/ URL,但并不总是适用于其他类型。如果您从 youtube 网站复制/粘贴 url,通常还有其他参数,例如 youtube.com/watch?v=oHg5SJYRHA0&player=normal&... 可能有十几个。如果您搜索最后一个=,请自行判断会发生什么
              • 哦,没错。但是,如果您搜索“v=”或“v/”的第一次出现,您会得到 id 的开头。 id 的结尾是字符串的结尾或下一个“&”。
              【解决方案10】:
              preg_match("#([\w\d\-]){11}#is", 'http://www.youtube.com/watch?v=y40ND8kXDlg', $matches);
              echo $matches[1];
              

              【讨论】:

                【解决方案11】:

                这是获取 youtube vedio id 或 url 中任何字段的最佳方式,但您必须将 index (V) 从 $ID_youtube['v'] 更改为您想要的任何内容。

                function getID_youtube($url)
                {
                    parse_str(parse_url($url, PHP_URL_QUERY), $ID_youtube);
                    return $ID_youtube['v'];
                }
                

                【讨论】:

                  【解决方案12】:
                  <?php
                  $link = "http://www.youtube.com/watch?v=oHg5SJYRHA0";
                  $video_id = str_replace('http://www.youtube.com/watch?v=', '', $link);
                  echo $video_id;
                  ?>
                  

                  输出:
                  oHg5SJYRHA0

                  Source

                  【讨论】:

                    【解决方案13】:
                    <?php
                    $url = "https://www.youtube.com/watch?v=uKW_FPsFiB8&feature=related";
                    parse_str( parse_url( $url, PHP_URL_QUERY ), $vid );
                    echo $vid['v'];    
                    
                    ?> 
                    

                    输出:uKW_FPsFiB8

                    这适用于https://www.youtube.com/watch?v=uKW_FPsFiB8&feature=relatedhttps://www.youtube.com/watch?v=vzH8FH1HF3A&feature=relmfu 或仅https://www.youtube.com/watch?v=uKW_FPsFiB8 等网址

                    【讨论】:

                      【解决方案14】:

                      所有 YouTube 视频 ID 的长度均为 11 个字符。我基于它编写了 Regex:

                      <?php
                      
                      $url = "https://www.youtube.com/watch?v=gooWdc6kb80";
                      
                      preg_match('/(?:\/|=)(.{11})(?:$|&|\?)/', $url, $matches);
                      
                      echo $matches[1];
                      
                      ?>
                      

                      它可以匹配不同的YouTube视频格式:

                      // http://youtu.be/dQw4w9WgXcQ
                      // http://www.youtube.com/embed/dQw4w9WgXcQ
                      // http://www.youtube.com/watch?v=dQw4w9WgXcQ
                      // http://www.youtube.com/?v=dQw4w9WgXcQ
                      // http://www.youtube.com/v/dQw4w9WgXcQ
                      // http://www.youtube.com/e/dQw4w9WgXcQ
                      // http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
                      // http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
                      // http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
                      // http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
                      // https://www.youtube.com/embed/dQw4w9WgXcQ?feature=oembed
                      // https://www.youtube.com/embed/dQw4w9WgXcQ?start=16&feature=oembed
                      

                      【讨论】:

                        猜你喜欢
                        • 2011-03-24
                        • 2021-02-10
                        • 2012-09-08
                        • 2020-11-05
                        • 2011-11-05
                        • 2016-01-11
                        • 2016-09-28
                        • 1970-01-01
                        • 2014-12-15
                        相关资源
                        最近更新 更多