RegEx模式可从任何YouTube网址获取YouTube视频ID

时间:2012-03-07 02:23:37

标签: php regex youtube youtube-api

我们以这些网址为例:

  1. http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player
  2. http://www.youtube.com/watch?v=8GqqjVXhfMU
  3. 此PHP函数将无法正确获取案例1中的ID,但案例2中的情况将是如此。案例1非常常见,其中任何内容都可以在YouTube ID后面。

    /**
     * get YouTube video ID from URL
     *
     * @param string $url
     * @return string YouTube video id or FALSE if none found. 
     */
    function youtube_id_from_url($url) {
        $pattern = 
            '%^# Match any YouTube URL
            (?:https?://)?  # Optional scheme. Either http or https
            (?:www\.)?      # Optional www 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=
              )             # End path alternatives.
            )               # End host alternatives.
            ([\w-]{10,12})  # Allow 10-12 for 11 char YouTube id.
            $%x'
            ;
        $result = preg_match($pattern, $url, $matches);
        if (false !== $result) {
            return $matches[1];
        }
        return false;
    }
    

    我在想的是,必须有一种方法可以只查找“v =”,无论它在URL中的哪个位置,然后取出字符。通过这种方式,不需要复杂的RegEx。这是基地吗?任何关于起点的想法?

9 个答案:

答案 0 :(得分:27)

if (preg_match('/youtube\.com\/watch\?v=([^\&\?\/]+)/', $url, $id)) {
  $values = $id[1];
} else if (preg_match('/youtube\.com\/embed\/([^\&\?\/]+)/', $url, $id)) {
  $values = $id[1];
} else if (preg_match('/youtube\.com\/v\/([^\&\?\/]+)/', $url, $id)) {
  $values = $id[1];
} else if (preg_match('/youtu\.be\/([^\&\?\/]+)/', $url, $id)) {
  $values = $id[1];
}
else if (preg_match('/youtube\.com\/verify_age\?next_url=\/watch%3Fv%3D([^\&\?\/]+)/', $url, $id)) {
    $values = $id[1];
} else {   
// not an youtube video
}

这是我用来从youtube网址中提取id的方法。我认为它适用于所有情况。

请注意,视频的结尾$ values = id

答案 1 :(得分:9)

而不是正则表达式。我强烈推荐parse_url()parse_str()

$url = "http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player";
parse_str(parse_url( $url, PHP_URL_QUERY ), $vars );
echo $vars['v'];    

完成

答案 2 :(得分:2)

您可以使用parse_urlparse_str

$query_string = parse_url($url, PHP_URL_QUERY);
parse_str($query_string);
echo $v;

答案 3 :(得分:1)

我使用了以下模式,因为YouTube也有一个youtube-nocookie.com域名:

'@youtube(?:-nocookie)?\.com/watch[#\?].*?v=([^"\& ]+)@i',
'@youtube(?:-nocookie)?\.com/embed/([^"\&\? ]+)@i',
'@youtube(?:-nocookie)?\.com/v/([^"\&\? ]+)@i',
'@youtube(?:-nocookie)?\.com/\?v=([^"\& ]+)@i',
'@youtu\.be/([^"\&\? ]+)@i',
'@gdata\.youtube\.com/feeds/api/videos/([^"\&\? ]+)@i',

在您的情况下,它只是意味着使用常规YouTube.com网址的可选(-nocookie)扩展现有表达式,如下所示:

if (preg_match('/youtube(?:-nocookie)\.com\/watch\?v=([^\&\?\/]+)/', $url, $id)) {

如果您将建议的表达式更改为不包含最终$,则它应该像您预期的那样工作。我也添加了-nocookie。

/**
 * get YouTube video ID from URL
 *
 * @param string $url
 * @return string YouTube video id or FALSE if none found. 
 */
function youtube_id_from_url($url) {
    $pattern = 
        '%^# Match any YouTube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        |youtube(?:-nocookie)?\.com  # or youtube.com and youtube-nocookie
          (?:           # Group path alternatives
            /embed/     # Either /embed/
          | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char YouTube id.
        %x'
        ;
    $result = preg_match($pattern, $url, $matches);
    if (false !== $result) {
        return $matches[1];
    }
    return false;
}

答案 4 :(得分:0)

另一种简单方法是使用parse_str()

<?php
    $url = 'http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player';
    parse_str($url, $yt);

    // The associative array $yt now contains all of the key-value pairs from the querystring (along with the base 'watch' URL, but doesn't seem you need that)
    echo $yt['v']; // echos '8GqqjVXhfMU';
?>

答案 5 :(得分:0)

parse_url建议很好。如果你真的想要一个正则表达式,你可以使用它:

/(?<=v=)[^&]+/`

答案 6 :(得分:0)

任何YOUTUBE LINK的解决方案:

http://youtube.com/v/dQw4w9WgXcQ
http://youtube.com/watch?v=dQw4w9WgXcQ
http://www.youtube.com/watch?feature=player&v=dQw4w9WgXcQ&var2=bla
http://youtu.be/dQw4w9WgXcQ

==

https://stackoverflow.com/a/20614061/2165415

答案 7 :(得分:0)

这是一个解决方案

/**
 * credits goes to: http://stackoverflow.com/questions/11438544/php-regex-for-youtube-video-id
 * update: mobile link detection
 */
public function parseYouTubeUrl($url)
{
     $pattern = '#^(?:https?://)?(?:www\.)?(?:m\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
     preg_match($pattern, $url, $matches);
     return (isset($matches[1])) ? $matches[1] : false;
}

它也可以处理移动链接。

答案 8 :(得分:-1)

这是我检索Youtube ID的功能!

function getYouTubeId($url) {
    if (!(strpos($url, 'v=') !== false)) return false;
    $parse = explode('v=', $url);
    $code = $parse[1];
    if (strlen($code) < 11) return false;
    $code = substr($code, 0, 11);
    return $code;
}