RegEx для получения идентификатора видео YouTube с любого URL-адреса YouTube

Давайте рассмотрим эти URL как пример:

  1. http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player
  2. http://www.youtube.com/watch?v=8GqqjVXhfMU

Эта функция PHP НЕ будет правильно получать идентификатор в случае 1, но в случае 2. Случай 1 очень распространен, где НИКОГДА может прийти за идентификатор YouTube.

/** * 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 (false !== $result) { return $matches[1]; } return false; } 

Я думаю, что должен быть способ, которым я могу просто искать «v =», независимо от того, где он находится в URL-адресе, и после этого брать символы. Таким образом, никакого сложного RegEx не потребуется. Это не так? Любые идеи для начинающих?

Related of "RegEx для получения идентификатора видео YouTube с любого URL-адреса YouTube"

 if (preg_match('/youtube\.com\/watch\?v=([^\&\?\/]+)/', $url, $id)) { $values = $id[1]; } else if (preg_match('/youtube\.com\/embed\/([^\&\?\/]+)/', $url, $id)) { $values = $id[1]; } else if (preg_match('/youtube\.com\/v\/([^\&\?\/]+)/', $url, $id)) { $values = $id[1]; } else if (preg_match('/youtu\.be\/([^\&\?\/]+)/', $url, $id)) { $values = $id[1]; } else if (preg_match('/youtube\.com\/verify_age\?next_url=\/watch%3Fv%3D([^\&\?\/]+)/', $url, $id)) { $values = $id[1]; } else { // not an youtube video } 

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

Обратите внимание, что в конце $ values ​​= id видео

Вместо регулярного выражения. Я настоятельно рекомендую parse_url() и parse_str() :

 $url = "http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player"; parse_str(parse_url( $url, PHP_URL_QUERY ), $vars ); echo $vars['v']; 

Готово

Вы могли бы просто использовать parse_url и parse_str :

 $query_string = parse_url($url, PHP_URL_QUERY); parse_str($query_string); echo $v; 

Еще один простой способ – использовать parse_str() :

 <?php $url = 'http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player'; parse_str($url, $yt); // The associative array $yt now contains all of the key-value pairs from the querystring (along with the base 'watch' URL, but doesn't seem you need that) echo $yt['v']; // echos '8GqqjVXhfMU'; ?> 

Предложения parse_url хороши. Если вы действительно хотите регулярное выражение, вы можете использовать это:

 /(?<=v=)[^&]+/` 

Я использовал следующие шаблоны, потому что у YouTube есть домен youtube-nocookie.com:

 '@youtube(?:-nocookie)?\.com/watch[#\?].*?v=([^"\& ]+)@i', '@youtube(?:-nocookie)?\.com/embed/([^"\&\? ]+)@i', '@youtube(?:-nocookie)?\.com/v/([^"\&\? ]+)@i', '@youtube(?:-nocookie)?\.com/\?v=([^"\& ]+)@i', '@youtu\.be/([^"\&\? ]+)@i', '@gdata\.youtube\.com/feeds/api/videos/([^"\&\? ]+)@i', 

В вашем случае это будет означать только расширение существующих выражений с необязательным (-nocookie) для обычного URL-адреса YouTube.com следующим образом:

 if (preg_match('/youtube(?:-nocookie)\.com\/watch\?v=([^\&\?\/]+)/', $url, $id)) { 

Если вы измените предлагаемое выражение, чтобы НЕ содержать окончательный $, он должен работать так, как вы планировали. Я также добавил -nocookie.

 /** * 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(?:-nocookie)?\.com # or youtube.com and youtube-nocookie (?: # 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 (false !== $result) { return $matches[1]; } return false; } 

РЕШЕНИЕ для любой YOUTUBE LINK:

 http://youtube.com/v/dQw4w9WgXcQ http://youtube.com/watch?v=dQw4w9WgXcQ http://www.youtube.com/watch?feature=player&v=dQw4w9WgXcQ&var2=bla http://youtu.be/dQw4w9WgXcQ 

==

https://stackoverflow.com/a/20614061/2165415

Вот одно решение

 /** * credits goes to: http://stackoverflow.com/questions/11438544/php-regex-for-youtube-video-id * update: mobile link detection */ public function parseYouTubeUrl($url) { $pattern = '#^(?:https?://)?(?:www\.)?(?:m\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x'; preg_match($pattern, $url, $matches); return (isset($matches[1])) ? $matches[1] : false; } 

Он также может иметь дело с мобильными ссылками.

Вот моя функция для получения идентификатора Youtube!

 function getYouTubeId($url) { if (!(strpos($url, 'v=') !== false)) return false; $parse = explode('v=', $url); $code = $parse[1]; if (strlen($code) < 11) return false; $code = substr($code, 0, 11); return $code; }