API Youtube – Извлечение идентификатора видео

Я кодирую функциональность, которая позволяет пользователям вводить URL-адрес видео Youtube. Я хотел бы извлечь идентификатор видео из этих URL-адресов.

Поддерживает ли Youtube API какую-то функцию, где я передаю ссылку, и она возвращает идентификатор видео. Или я должен сам разбирать струну?

Я использую PHP … Я был бы признателен за любые образцы указателей / кода в этом отношении.

благодаря

Вот примерная функция, которая использует регулярное выражение для извлечения идентификатора youtube из 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; } echo youtube_id_from_url('http://youtu.be/NLqAF9hrVbY'); # NLqAF9hrVbY 

Это принятие ответа по аналогичному вопросу .


Это не тот API, который вы ищете, но, вероятно, полезно. Youtube имеет услугу:

 $url = 'http://youtu.be/NLqAF9hrVbY'; var_dump(json_decode(file_get_contents(sprintf('http://www.youtube.com/oembed?url=%s&format=json', urlencode($url))))); 

Которая предоставляет дополнительную метаинформацию о URL-адресе:

 object(stdClass)#1 (13) { ["provider_url"]=> string(23) "http://www.youtube.com/" ["title"]=> string(63) "Hang Gliding: 3 Flights in 8 Days at Northside Point of the Mtn" ["html"]=> string(411) "<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/NLqAF9hrVbY?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NLqAF9hrVbY?version=3" type="application/x-shockwave-flash" width="425" height="344" allowscriptaccess="always" allowfullscreen="true"></embed></object>" ["author_name"]=> string(11) "widgewunner" ["height"]=> int(344) ["thumbnail_width"]=> int(480) ["width"]=> int(425) ["version"]=> string(3) "1.0" ["author_url"]=> string(39) "http://www.youtube.com/user/widgewunner" ["provider_name"]=> string(7) "YouTube" ["thumbnail_url"]=> string(48) "http://img.ruphp.com/php/hqdefault.jpg" ["type"]=> string(5) "video" ["thumbnail_height"]=> int(360) } 

Но идентификатор не является прямой частью ответа. Однако он может содержать информацию, которую вы ищете, и может быть полезно проверить URL-адрес youtube.

Я делаю небольшие изменения в вышеупомянутом регулярном выражении, хотя он отлично работает для короткого URL youtube (который использовался в приведенном выше примере) и простого URL-адреса видео, где никакой другой параметр не поступает после видеокода, но он не работает для Такие URL-адреса, как http://www.youtube.com/watch?v=B_izAKQ0WqQ&feature=related как видеокод, не являются последним параметром в этом URL-адресе. Точно так же v = {video_code} не всегда приходит после просмотра (в то время как выше регулярное выражение предполагает, что оно всегда будет появляться после просмотра?), Например, если пользователь выбрал язык ИЛИ местоположение из нижнего колонтитула, например, если пользователь выбрал Английский (Великобритания) с помощью параметра «Язык», тогда URL будет http://www.youtube.com/watch?feature=related&hl=ru-RU&v=B_izAKQ0WqQ

Поэтому я сделал некоторые изменения в вышеупомянутых регулярных выражениях, но, безусловно, кредит относится к hakre для обеспечения базового регулярного выражения, благодаря @hakre:

 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/ | .*v= # or /watch\?v= ) # End path alternatives. ) # End host alternatives. ([\w-]{10,12}) # Allow 10-12 for 11 char youtube id. ($|&).* # if additional parameters are also in query string after video id. $%x' ; $result = preg_match($pattern, $url, $matches); if (false !== $result) { return $matches[1]; } return false; } 

Вы можете использовать функцию parse_url PHP для извлечения имени хоста, пути, строки запроса и фрагмента. Затем вы можете использовать строковые функции PHP для определения идентификатора видео.

 function getYouTubeVideoId($url) { $video_id = false; $url = parse_url($url); if (strcasecmp($url['host'], 'youtu.be') === 0) { #### (dontcare)://youtu.be/<video id> $video_id = substr($url['path'], 1); } elseif (strcasecmp($url['host'], 'www.youtube.com') === 0) { if (isset($url['query'])) { parse_str($url['query'], $url['query']); if (isset($url['query']['v'])) { #### (dontcare)://www.youtube.com/(dontcare)?v=<video id> $video_id = $url['query']['v']; } } if ($video_id == false) { $url['path'] = explode('/', substr($url['path'], 1)); if (in_array($url['path'][0], array('e', 'embed', 'v'))) { #### (dontcare)://www.youtube.com/(whitelist)/<video id> $video_id = $url['path'][1]; } } } return $video_id; } $urls = array( 'http://youtu.be/dQw4w9WgXcQ', 'http://www.youtube.com/?v=dQw4w9WgXcQ', 'http://www.youtube.com/?v=dQw4w9WgXcQ&feature=player_embedded', 'http://www.youtube.com/watch?v=dQw4w9WgXcQ', 'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=player_embedded', 'http://www.youtube.com/v/dQw4w9WgXcQ', 'http://www.youtube.com/e/dQw4w9WgXcQ', 'http://www.youtube.com/embed/dQw4w9WgXcQ' ); foreach ($urls as $url) { echo sprintf('%s -> %s' . PHP_EOL, $url, getYouTubeVideoId($url)); } 

Простой, как return substr (strstr ($ url, 'v ='), 2, 11);

Я знаю, что это очень поздний ответ, но я нашел этот поток при поиске темы, поэтому я хочу предложить более элегантный способ сделать это с помощью oEmbed :

 echo get_embed('youtube', 'https://www.youtube.com/watch?v=IdxKPCv0bSs'); function get_embed($provider, $url, $max_width = '', $max_height = ''){ $providers = array( 'youtube' => 'http://www.youtube.com/oembed' /* you can add support for more providers here */ ); if(!isset($providers[$provider])){ return 'Invalid provider!'; } $movie_data_json = @file_get_contents( $providers[$provider] . '?url=' . urlencode($url) . "&maxwidth={$max_width}&maxheight={$max_height}&format=json" ); if(!$movie_data_json){ $error = error_get_last(); /* remove the PHP stuff from the error and show only the HTTP error message */ $error_message = preg_replace('/.*: (.*)/', '$1', $error['message']); return $error_message; }else{ $movie_data = json_decode($movie_data_json, true); return $movie_data['html']; } } 

oEmbed позволяет встраивать контент из большего количества сайтов, просто добавив конечную точку oEmbed API в массив $ providers в приведенном выше коде.

Вот простое решение, которое сработало для меня.

VideoId является самым длинным словом в любых URL-адресах YouTube и содержит (буквенно-цифровой + «-») с минимальной длиной 8, окруженный символами неслов. Таким образом, вы можете искать ниже регулярного выражения в URL-адресе в качестве группы, и первая группа – ваш ответ. Первая группа, потому что некоторые параметры youtube, такие как enablejsapi, содержат более 8 символов, но они всегда появляются после видео.

Regex: "\ W ([\ w -] {9,}) (\ W | $)"

Вот рабочий код Java:

 String[] youtubeUrls = { "https://www.youtube.com/watch?v=UzRtrjyDwx0", "https://youtu.be/6butf1tEVKs?t=22s", "https://youtu.be/R46-XgqXkzE?t=2m52s", "http://youtu.be/dQw4w9WgXcQ", "http://www.youtube.com/?v=dQw4w9WgXcQ", "http://www.youtube.com/?v=dQw4w9WgXcQ&feature=player_embedded", "http://www.youtube.com/watch?v=dQw4w9WgXcQ", "http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=player_embedded", "http://www.youtube.com/v/dQw4w9WgXcQ", "http://www.youtube.com/e/dQw4w9WgXcQ", "http://www.youtube.com/embed/dQw4w9WgXcQ" }; String pattern = "\\W([\\w-]{9,})(\\W|$)"; Pattern pattern2 = Pattern.compile(pattern); for (int i=0; i<youtubeUrls.length; i++){ Matcher matcher2 = pattern2.matcher(youtubeUrls[i]); if (matcher2.find()){ System.out.println(matcher2.group(1)); } else System.out.println("Not found"); } 

Как упоминалось в комментарии ниже действительного ответа, мы используем его так, и он работает отлично!

 function youtube_id_from_url($url) { $url = trim(strtok("$url", '?')); $url = str_replace("#!/", "", "$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; } 

Как насчет этого:

 function getVideoId() { $query = parse_url($this->url, PHP_URL_QUERY); $arr = explode('=', $query); $index = array_search('v', $arr); if ($index !== false) { if (isset($arr[$index++])) { $string = $arr[$index++]; if (($amp = strpos($string, '&')) !== false) { return substr($string, 0, $amp); } else { return $string; } } else { return false; } } return false; } 

Нет регулярных выражений, поддержка нескольких параметров запроса, т. https://www.youtube.com/watch?v=PEQxWg92Ux4&index=9&list=RDMMom0RGEnWIEk также работает.