2012-04-02 2 views
4

В настоящее время я пишу webapp, в котором некоторые страницы сильно зависят от возможности вытащить правильное видео в YouTube и играть в него. В URLS YouTube поставляются пользователям и по этой причине, как правило, приходят с вариантами один из них может выглядеть следующим образом:получение youtube video id PHP

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; 

} 

Как я могу иметь дело с URLS, которые используют версию ?v, а не версию /v/?

+0

Возможный дубликат: http://stackoverflow.com/questions/2936467/parse-youtube-video-id-using-preg-match – Alexander

+0

Возможно дубликата : http: //stackoverflow.com/questions/5831191/.... – safarov

+1

Er, приведенный выше код уже работает с первым URL-адресом? – cmbuckley

ответ

6

Как это:

$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]+) 
+2

Это не всегда будет работать. Если вы копируете/вставляете URL-адреса с веб-сайта YouTube, часто бывают другие параметры, такие как 'http: //www.youtube.com/watch? V = oHg5SJYRHA0 & player = normal & ... Их может быть дюжина. Ваш код будет выдавать идентификатор 'oHg5SJYRHA0 & player = normal & ...' - что явно неверно –

+0

Исправлено это. Посмотрите на новое решение. –

+0

Или посмотрите мой код здесь: https://github.com/lingtalfi/video-ids-and-thumbnails/blob/master/testvideo.php Он обрабатывает различные URL-адреса youtube, а также vimeo и dailymotion. – ling

0
$parts = explode('=', $link); 

// $parts[1] will y40ND8kXDlg 

Этот пример работает только в том случае, если в URL есть один символ '='. Всегда может быть больше?

+0

Если вы копируете/вставляете URL-адреса с веб-сайта YouTube, часто бывают другие параметры, таких как 'http: //www.youtube.com/watch? v = oHg5SJYRHA0 & player = normal & ... Их может быть дюжина. –

0

Я просто искал бы последний «/» или последний «=». После этого вы всегда найдете идентификатор видео.

+0

Это может работать с URL '/', но не всегда будет работать с другим типом. Если вы копируете/вставляете URL-адреса с веб-сайта YouTube, часто бывают другие параметры, такие как http: //www.youtube.com/watch? V = oHg5SJYRHA0 & player = normal & ... Их может быть дюжина. Судите сами, что произойдет, если вы будете искать последний '=' –

+0

oh thats right. но если вы ищете первое появление «v =» или «v /», вы получите начало идентификатора. конец id - это конец строки или следующий «&». – ESCOBAR

1

Try:


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); 

Должен работать как для

0
preg_match("#([\w\d\-]){11}#is", 'http://www.youtube.com/watch?v=y40ND8kXDlg', $matches); 
echo $matches[1]; 
1

Хорошо, это гораздо лучше ответ, чем моя предыдущая:

$link = 'http://www.youtube.com/watch?v=oHg5SJYRHA0&player=normal'; 

    strtok($link, '?'); 

    parse_str(strtok('')); 

    echo $v; 

Это может быть хорошо, чтобы иметь это в функции, чтобы сохранить новые переменные из ряда глобальный охват (если вы не хотите их там, очевидно).

1

Возможно, это еще не используется, но могут быть другие люди, которые ищут ответ, чтобы получить идентификатор YouTube с URL-адреса.

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]; 
} 

Надеюсь, это поможет кому-то :)!

0

Это лучший способ получить идентификатор youtube vedio id или любое поле в URL-адресе, но вы должны изменить индекс (V) из $ ID_youtube ['v'] на все, что хотите.

function getID_youtube($url) 
{ 
    parse_str(parse_url($url, PHP_URL_QUERY), $ID_youtube); 
    return $ID_youtube['v']; 
} 
0
<?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

0
<?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) 
?>