获取youtube视频ID为PHP

Udd*_*ers 4 php youtube url get parse-url

我目前正在编写一个webapp,其中一些页面严重依赖于能够将正确的youtube视频拉入其中并进行播放.youtube URLS由用户提供,因此通常会带有变体,其中一个可能如下所示:

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;

}
Run Code Online (Sandbox Code Playgroud)

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

Kam*_*esh 11

<?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];
?>
Run Code Online (Sandbox Code Playgroud)


Dan*_*kov 8

像这样:

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

这是通用解决方案:

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

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

(\?v=|/v/)([-a-zA-Z0-9]+)
Run Code Online (Sandbox Code Playgroud)

  • 这并不总是有效.如果您从youtube网站复制/粘贴网址,通常会有其他参数,例如`http://www.youtube.com/watch?v = oHg5SJYRHA0&player = normal&...可能有十几个这样的参数.你的代码会产生`oHg5SJYRHA0&player = normal&...`的ID - 这显然是错误的 (3认同)