2010-08-03 2 views
107

Может ли кто-нибудь показать мне, как получить идентификатор youtube из URL-адреса независимо от того, какие другие переменные GET указаны в URL-адресе.PHP Regex для получения идентификатора видео youtube?

Используйте это видео, например: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Так между v= и до следующего &

+0

Это может быть полезно http://stackoverflow.com/questions/9522868/how-do-i-get-a-youtube-video-id-php – 2012-04-13 13:04:06

+1

Вы должны посмотреть мой код https://github.com/lingtalfi/ video-ids-и-thumbnails/blob/master/testvideo.php, я предоставляю функции, которые извлекают id из youtube, vimeo и dailymotion. – ling

+0

@ling в функции getVideoThumbnailByUrl() вы использовали устаревший файл_get_contents() для Vimeo. Эта замена будет работать везде: '$ ch = curl_init(); \t curl_setopt ($ ch, CURLOPT_URL, "http://vimeo.com/api/v2/video/$id.php"); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, 5); $ hash = unserialize (curl_exec ($ ch)); curl_close ($ ch); ' – jerrygarciuh

ответ

250

Use parse_url() и parse_str().

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

parse_url принимает строка и вырезает ее в массив, содержащий кучу информации. Вы можете работать с этим массивом, или вы можете указать один элемент, который вы хотите, в качестве второго аргумента. В этом случае нас интересует запрос, который равен PHP_URL_QUERY.

Теперь у нас есть запрос, который является v=C4kxS1ksqtw&feature=relate, но нам нужна только часть после v=. Для этого перейдем к parse_str, который в основном работает как GET на строке. Он берет строку и создает переменные, указанные в строке. В этом случае создаются $v и $feature. Нас интересует только $v.

Чтобы быть в безопасности, вы не хотите просто хранить все переменные из parse_url в своем пространстве имен (см. Комментарий mellowsoon). Вместо этого сохраните переменные как элементы массива, чтобы вы контролировали, какие переменные вы храните, и вы не можете случайно перезаписать существующую переменную.

Сложив все вместе, мы имеем:

<?php 
$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=relate"; 
parse_str(parse_url($url, PHP_URL_QUERY), $my_array_of_vars); 
echo $my_array_of_vars['v'];  
    // Output: C4kxS1ksqtw 
?> 

Working example


Edit:

хехе - спасибо Чарльзу. Это заставило меня смеяться, я никогда не видел цитату Завински до:

Some people, when confronted with a problem, think ‘I know, I’ll use regular expressions.’ Now they have two problems. - Джейми Завински

+1

Хотя он не использует регулярное выражение (по крайней мере заметно - я не уверен, как 'parse_url()' работает под капотом), это путь. –

+9

<Вставить Zawinski Цитировать здесь>. Хотя во всей серьезности использование языковых функций для выполнения задачи часто будет лучше, чем прыжок с обручем, который может потребоваться для хорошего регулярного выражения. – Charles

+1

Я бы предложил использовать второй параметр parse_str() для хранения параметров запроса в массиве. Наличие переменных, магически возникающих из воздуха, никогда не является хорошей идеей. – mellowsoon

4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m)) 
    $video_id = $m[1]; 
+0

Спасибо, Это сработало хорошо для меня, так как я хотел все домены, http и https, и любые другие дерьмы в URL. – MakuraYami

4
(?<=\?v=)([a-zA-Z0-9_-]){11} 

Это должно сделать его.

2
$vid = preg_replace('/^.*(\?|\&)v\=/', '', $url); // Strip all meuk before and including '?v=' or '&v='. 

$vid = preg_replace('/[^\w\-\_].*$/', '', $vid); // Strip trailing meuk. 
130
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches); 

Это составит

youtube.com/v/{vidid} 
youtube.com/vi/{vidid} 
youtube.com/?v={vidid} 
youtube.com/?vi={vidid} 
youtube.com/watch?v={vidid} 
youtube.com/watch?vi={vidid} 
youtu.be/{vidid} 

я улучшил его немного поддержать: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

линии я использую сейчас:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches); 
+3

Я обновил его, чтобы обрабатывать URL-адреса следующим образом: http://www.youtube.com/embed/7zuAOomfiCc '# (? <= v =) [a-zA-Z0-9 -] + (= &?) | (? <= v \ /) (? = \) | (? <= встраивать /)? [^ & \ п] + [^ & \ п] + | (<= v =) [^ & \ n] + | (? <= youtu.be /) [^ & \ n] + # ' – simonbs

+0

Комментарий Arun SS:« @SimonBS, '# (? <= v =) [a- Za-z0-9 -] + (= &?) | (? <= v \ /) (? = \) | (? <= встраивать /) [^ & \ п] + [^ & \ п] + | (? <= v =) [^ & \ n] + | (? <= youtu.be/)[^&\ n] + # 'отлично работает для встраивания кодов. Это добавление оставшихся частей URL-адреса. Результат выглядит так: '45EFxhTeKwy 'frameborder =" 0 "allowfullscreen>' Как удалить оставшиеся части? " –

+10

Это работает для всех URL-адресов, включая встроенные строки' (? <= (?: v | i) =) [A-Za-Z0-9 -] + (= &) |?? (<= (v ?: | я) \ /) [^ & \ п] + | (<= встраивать \ /) [^ "и \ п] + |? (<= (?: v | i) =) [^ & \ n] + | (? <= youtu.be \ /) [^ & \ n] + 'http://rubular.com/r/M9PJYcQxRW – Rob

4

Я имел какой-то pos я должен был зашифровать всю информацию, чтобы получить идентификатор Youtube.Это оказалось в виде кода встраивания , который предоставляет Youtube.

<iframe src="http://www.youtube.com/embed/Zpk8pMz_Kgw?rel=0" frameborder="0" width="620" height="360"></iframe> 

Следующий рисунок, который я получил от @rob выше. Фрагмент выполняет цикл foreach после того, как совпадения найдены, и для дополнительного бонуса я связал его с изображением предварительного просмотра, которое было найдено на Youtube. Это потенциально может соответствовать несколько типов типов внедренными Youtube и URLs:

$pattern = '#(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=‌​(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#'; 

preg_match_all($pattern, $post_content, $matches); 

foreach ($matches as $match) { 
    $img = "<img src='http://img.youtube.com/vi/".str_replace('?rel=0','', $match[0])."/0.jpg' />"; 
    break; 
} 

Профиль Роба: https://stackoverflow.com/users/149615/rob

2

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

function get_youtube_id($url) 
{ 
    if (strpos($url,"v=") !== false) 
    { 
     return substr($url, strpos($url, "v=") + 2, 11); 
    } 
    elseif(strpos($url,"embed/") !== false) 
    { 
     return substr($url, strpos($url, "embed/") + 6, 11); 
    } 

} 

Я рекомендую это потому, что ID видео YouTube всегда одинаково, независимо от стиля URL, например

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `и другие ULR форма, в которой слово "встраивать /" ставится перед Ид ... !!

, и это может иметь место для встроенных и iframe -ed.

84

Основываясь на комментарий Бокор на ответ Энтони:

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

$matches[1] содержит vidid

Матчи:

Не соответствует:

  • www.facebook.com?wtv=youtube.ком/v/vidid
+0

у вас есть/ObjC/C++ версии C этой строки? Я не знаю, какие части уйти. –

+0

Я пробовал: «^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be/| . YouTube \\ ком/\: v: = (:(?: смотреть?)? (* &?.)? (я?) |? (? встраивать | v | VI | пользователь) /)) ([^\? & \ "'>] +)" Не передавать все ваши примеры –

+1

Я нашел свою проблему. здесь это последняя строка c: «^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be/| youtube \\. com/(? :(?: часы) \\: v: =? (* &?.)? (я?) |? (? встраивать | v | VI | пользователь) /)) ([^ \ & \ "'>] +)" –

26

Это может быть очень легко осуществить с помощью parse_str и parse_url и является более надежным, на мой взгляд.

Моя функция поддерживает следующие адреса:

включает в себя также тест ниже функции.

/** 
* Get Youtube video ID from URL 
* 
* @param string $url 
* @return mixed Youtube video ID or FALSE if not found 
*/ 
function getYoutubeIdFromUrl($url) { 
    $parts = parse_url($url); 
    if(isset($parts['query'])){ 
     parse_str($parts['query'], $qs); 
     if(isset($qs['v'])){ 
      return $qs['v']; 
     }else if(isset($qs['vi'])){ 
      return $qs['vi']; 
     } 
    } 
    if(isset($parts['path'])){ 
     $path = explode('/', trim($parts['path'], '/')); 
     return $path[count($path)-1]; 
    } 
    return false; 
} 
// Test 
$urls = array(
    'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player', 
    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player', 
    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 
    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 
    'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 
    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 
    'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player' 
); 
foreach($urls as $url){ 
    echo $url . ' : ' . getYoutubeIdFromUrl($url) . "\n"; 
} 
+1

Здесь много величия. – Mattis

+0

Это действительно здорово и на самом деле работает для видео Vimeo, а также –

+1

Это также мой предпочтительный ответ. Он охватывает как YouTube, так и Vimeo. Одна заметка: я добавил супер-мелкую настройку с дополнительным isset() - else if (isset ($ qs ['vi'])). Большое спасибо за это. – spedley

15

SOLTUION Для любого типа ссылки !!:

<?php 
function get_youtube_id_from_url($url) { 
    preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $results); return $results[6]; 
} 


echo get_youtube_id_from_url('http://www.youtube.com/watch?var1=blabla#v=GvJehZx3eQ1$var2=bla'); 
     // or     http://youtu.be/GvJehZx3eQ1 
     // or     http://www.youtube.com/embed/GvJehZx3eQ1 
     // or     http://www.youtu.be/GvJehZx3eQ1/blabla?xyz 
?> 

выходы:GvJehZx3eQ1

8

Мы знаем, что идентификатор видео составляет 11 длина символов и может предшествовать v= или vi= или v/ или vi/ или youtu.be/. Поэтому самый простой способ сделать это:

<?php 
$youtube = 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player 
http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player 
http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player 
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player 
http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player 
http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player 
http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player 
http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'; 

preg_match_all("#(?<=v=|v\/|vi=|vi\/|youtu.be\/)[a-zA-Z0-9_-]{11}#", $youtube, $matches); 

var_dump($matches[0]); 

И вывод:

array(8) { 
    [0]=> 
    string(11) "dQw4w9WgXcQ" 
    [1]=> 
    string(11) "dQw4w9WgXcQ" 
    [2]=> 
    string(11) "dQw4w9WgXcQ" 
    [3]=> 
    string(11) "dQw4w9WgXcQ" 
    [4]=> 
    string(11) "dQw4w9WgXcQ" 
    [5]=> 
    string(11) "dQw4w9WgXcQ" 
    [6]=> 
    string(11) "dQw4w9WgXcQ" 
    [7]=> 
    string(11) "dQw4w9WgXcQ" 
} 
9

Seen все ответы я построю этот ответ:

$links = [ 
    "youtube.com/v/tFad5gHoBjY", 
    "youtube.com/vi/tFad5gHoBjY", 
    "youtube.com/?v=tFad5gHoBjY", 
    "youtube.com/?vi=tFad5gHoBjY", 
    "youtube.com/watch?v=tFad5gHoBjY", 
    "youtube.com/watch?vi=tFad5gHoBjY", 
    "youtu.be/tFad5gHoBjY", 
    "http://youtu.be/qokEYBNWA_0?t=30m26s", 
    "youtube.com/v/vidid", 
    "youtube.com/vi/vidid", 
    "youtube.com/?v=vidid", 
    "youtube.com/?vi=vidid", 
    "youtube.com/watch?v=vidid", 
    "youtube.com/watch?vi=vidid", 
    "youtu.be/vidid", 
    "youtube.com/embed/vidid", 
    "http://youtube.com/v/vidid", 
    "http://www.youtube.com/v/vidid", 
    "https://www.youtube.com/v/vidid", 
    "youtube.com/watch?v=vidid&wtv=wtv", 
    "http://www.youtube.com/watch?dev=inprogress&v=vidid&feature=related" 
]; 

foreach($links as $link){ 
    preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)(\w+)#", $link, $matches); 
    var_dump(end($matches)); 
} 
+0

Сбой на https://www.youtube.com/watch?v=7HCZvhRAk-M –

0

Просто нашел в Интернете по адресу http://snipplr.com/view/62238/get-youtube-video-id-very-robust/

function getYouTubeId($url) { 
// Format all domains to http://domain for easier URL parsing 
str_replace('https://', 'http://', $url); 
if (!stristr($url, 'http://') && (strlen($url) != 11)) { 
    $url = 'http://' . $url; 
} 
$url = str_replace('http://www.', 'http://', $url); 

if (strlen($url) == 11) { 
    $code = $url; 
} else if (preg_match('/http:\/\/youtu.be/', $url)) { 
    $url = parse_url($url, PHP_URL_PATH); 
    $code = substr($url, 1, 11); 
} else if (preg_match('/watch/', $url)) { 
    $arr = parse_url($url); 
    parse_str($url); 
    $code = isset($v) ? substr($v, 0, 11) : false; 
} else if (preg_match('/http:\/\/youtube.com\/v/', $url)) { 
    $url = parse_url($url, PHP_URL_PATH); 
    $code = substr($url, 3, 11); 
} else if (preg_match('/http:\/\/youtube.com\/embed/', $url, $matches)) { 
    $url = parse_url($url, PHP_URL_PATH); 
    $code = substr($url, 7, 11); 
} else if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $url, $matches)) { 
    $code = substr($matches[0], 0, 11); 
} else { 
    $code = false; 
} 

if ($code && (strlen($code) < 11)) { 
    $code = false; 
} 

return $code; 
}