Давайте рассмотрим эти URL как пример:
Эта функция 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 не потребуется. Это не так? Любые идеи для начинающих?
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
==
Вот одно решение
/** * 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; }