Шаблон регулярного выражения для получения идентификатора видео 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-адресе, и после этого возьмите символы. Таким образом, никаких сложных регулярных выражений не потребуется. Это что, не по правилам? Есть идеи для отправных точек?

Author: user2428118, 2012-03-07

9 answers

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 = идентификатор видео

 27
Author: alex.dominte, 2015-01-22 12:38:28

Вместо регулярного выражения. Я настоятельно рекомендую 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'];    

Готово

 9
Author: Starx, 2012-03-07 02:50:18

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

$query_string = parse_url($url, PHP_URL_QUERY);
parse_str($query_string);
echo $v;
 2
Author: jeroen, 2012-03-07 02:34:05

Еще один простой способ - использовать 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';
?>
 0
Author: Morgon, 2012-03-07 02:34:13

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

/(?<=v=)[^&]+/`
 0
Author: Jacob Eggers, 2012-03-07 02:35:16

Я использовал следующие шаблоны, потому что на 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) для обычного YouTube.com URL-адрес примерно такой:

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;
}
 0
Author: teezee, 2013-10-07 15:43:11

РЕШЕНИЕ для любой ССЫЛКИ на YOUTUBE:

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

 0
Author: T.Todua, 2017-05-23 12:10:42

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

/**
 * 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;
}

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

 0
Author: Ante Braovic, 2014-04-16 13:25:42

Вот моя функция для получения идентификатора 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;
}
 -1
Author: Mr. Kent, 2015-07-30 18:53:52