如何从此URL中提取YouTube视频ID

4
如何从此URL中提取YouTube ID?
https%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253Dnn5hCEMyE-E

我尝试了这个正则表达式:

$url = $_GET["q"];
preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches);
2个回答

15

先解码,然后使用数组 matches 的第二个索引 ([1]):

if(isset($_GET["q"]))
{
    $url = urldecode(rawurldecode($_GET["q"]));
    # https://www.youtube.com/watch?v=nn5hCEMyE-E
    preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches);
    echo $matches[1];
    # nn5hCEMyE-E
}

3
尝试这个(不要忘记在传递给函数之前进行urldecode(rawurldecode($url))处理)。
   /*
    * 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 ($result) {
                return $matches[1];
            }
            return false;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接