PHP Regex для получения идентификатора видео youtube?

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

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

Solutions Collecting From Web of "PHP Regex для получения идентификатора видео youtube?"

Используйте parse_url () и parse_str () .

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

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

Теперь у нас есть запрос, который равен v=C4kxS1ksqtw&feature=relate , но мы хотим только часть после v= . Для этого мы переходим к parse_str который в основном работает как GET на строке. Он берет строку и создает переменные, указанные в строке. В этом случае создается $feature $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 ?> 

Рабочий пример


Редактировать:

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

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

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

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

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

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

Матчи:

Не совпадает:

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

Моя функция поддерживает следующие 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"; } 

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

Мы знаем, что ID видео имеет длину 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" } 

Видимо, все ответы я строю этот ответ:

 $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)); } 
 if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m)) $video_id = $m[1]; 

У меня было какое-то сообщение, которое я должен был зашифровать, чтобы получить Youtube ID. Это оказалось в форме кода <iframe> встраивания Youtube.

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

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

 $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

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

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

 $vid = preg_replace('/^.*(\?|\&)v\=/', '', $url); // Strip all meuk before and including '?v=' or '&v='. $vid = preg_replace('/[^\w\-\_].*$/', '', $vid); // Strip trailing meuk. 

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

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

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

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

и это может иметь место для встроенных и iframe файлов.