Как получить идентификатор видео YouTube с URL-адреса?

210

Я хочу получить v=id с URL-адреса YouTubes с помощью JavaScript (без jQuery, чистого JavaScript).

Примеры форматов URL-адресов YouTube

http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW

http://www.youtube.com/watch?v=u8nQa1cJyX8

Или любой другой формат YouTube, содержащий идентификатор видео в URL.

Результат из этих форматов

u8nQa1cJyX8

  • 1
    возможный дубликат значения параметра Extract из URL с использованием регулярных выражений
  • 0
    Этот вопрос только для форматов, как мой второй. Но я нашел там интересный ответ, спасибо, что поделился им.
Показать ещё 4 комментария
Теги:
url
youtube

32 ответа

96
Лучший ответ

Для этого вам не нужно использовать регулярное выражение.

var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}
  • 0
    это полезная функция, чтобы заставить ее работать там, где вы хотите, основываясь на этом коде. var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata '; ytid (video_url); function ytid (video_url) {var video_id = video_url.split ('v =') [1]; var ampersandPosition = video_id.indexOf ('&'); if (ampersandPosition! = -1) {video_id = video_id.substring (0, ampersandPosition); } alert (video_id); return video_id; }
  • 28
    это только обрабатывает один формат URL YouTube ...
Показать ещё 2 комментария
320

Я сделал усовершенствование Regex, предоставленное "jeffreypriebe", потому что ему нужен был своего рода URL-адрес YouTube - URL-адрес видео, когда они просматривают канал.

Ну нет, но это функция, которую я вооружил.

<script type="text/javascript">
function youtube_parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
    var match = url.match(regExp);
    return (match&&match[7].length==11)? match[7] : false;
}
</script>

Это типы поддерживаемых URL

http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg

Можно найти в [http://web.archive.org/web/20160926134334/] http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube

  • 6
    Регулярное выражение содержит небольшую ошибку \ ?? v? =? это должно быть только в части наблюдения, иначе вы бы отфильтровали 'v', если идентификатор начинается с 'v'. так что это должно сделать трюк /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
  • 55
    Еще чище: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ Затем используйте match[1] вместо match[7] (что мне показалось немного произвольным). Также исправляет ошибку, указанную WebDev.
Показать ещё 10 комментариев
218

Я упростил Ласнув немного.

Он также исправляет ошибку, которую описывает WebDeb.

Вот он:

var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
var match = url.match(regExp);
if (match && match[2].length == 11) {
  return match[2];
} else {
  //error
}

Вот ссылка для регулярного выражения:   http://regexr.com/3dnqv

  • 0
  • 2
    просто один на один: это следует использовать только тогда, когда вы знаете, что имеете дело с URL-адресом YouTube. Я (ошибочно) использовал его для проверки URL как YouTube, что вызвало ложные срабатывания, например, это проходит: 'v / 2059-9080-5437'
Показать ещё 12 комментариев
75

Ни один из них не работал на кухонной раковине по состоянию на 1/1/2015, в частности URL-адреса без проточных http/s и с доменом youtube-nocookie. Итак, здесь изменена версия, которая работает на всех этих различных версиях Youtube:

// Just the regex. Output is in [1].
/^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/

// For testing.
var urls = [
    '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
    'http://youtu.be/6dwqZw0j_jY',
    'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
    'http://youtu.be/afa-5HQHiAs',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
    'http://www.youtube.com/watch?v=peFZbP64dsU',
    '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'
];

var i, r, rx = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/;

for (i = 0; i < urls.length; ++i) {
    r = urls[i].match(rx);
    console.log(r[1]);
}
  • 2
    Стоит отметить, что многие из вышеперечисленных решений не охватывают эту широкую серию действительных URL, тестовый скрипт очень полезен, +1!
  • 1
    Обратите внимание, что это будет одурачено чем-то вроде «www.engadget.com/watch?v=dQw4w9WgXcQ», но это не может быть проблемой, хотя
Показать ещё 2 комментария
21
/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/

Протестировано:

  • http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0
  • http://www.youtube.com/embed/0zM3nApSvMg?rel=0
  • http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
  • http://www.youtube.com/watch?v=0zM3nApSvMg
  • http://youtu.be/0zM3nApSvMg
  • http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
  • http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/KdwsulMb8EQ
  • http://youtu.be/dQw4w9WgXcQ
  • http://www.youtube.com/embed/dQw4w9WgXcQ
  • http://www.youtube.com/v/dQw4w9WgXcQ
  • http://www.youtube.com/e/dQw4w9WgXcQ
  • http://www.youtube.com/watch?v=dQw4w9WgXcQ
  • http://www.youtube.com/?v=dQw4w9WgXcQ
  • http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/user/IngridMichaelsonVEVO#p/u/11/KdwsulMb8EQ
  • http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0

Вдохновленный этот другой ответ.

  • 7
    ^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). * даст Вы результат в группе 1
17

Я создал функцию, которая проверяет вход пользователей для Youtube, Soundcloud или Vimeo embed ID, чтобы иметь возможность создавать более непрерывный дизайн со встроенными медиа. Эта функция обнаруживает и возвращает объект с двумя свойствами: "тип" и "идентификатор". Тип может быть "youtube", "vimeo" или "soundcloud", а свойство "id" является уникальным идентификатором носителя.

На сайте я использую дамп textarea, где пользователь может вставлять любой тип ссылки или код вставки, включая iFrame-вложение как vimeo, так и youtube.

function testUrlForMedia(pastedData) {
var success = false;
var media   = {};
if (pastedData.match('http://(www.)?youtube|youtu\.be')) {
    if (pastedData.match('embed')) { youtube_id = pastedData.split(/embed\//)[1].split('"')[0]; }
    else { youtube_id = pastedData.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; }
    media.type  = "youtube";
    media.id    = youtube_id;
    success = true;
}
else if (pastedData.match('http://(player.)?vimeo\.com')) {
    vimeo_id = pastedData.split(/video\/|http:\/\/vimeo\.com\//)[1].split(/[?&]/)[0];
    media.type  = "vimeo";
    media.id    = vimeo_id;
    success = true;
}
else if (pastedData.match('http://player\.soundcloud\.com')) {
    soundcloud_url = unescape(pastedData.split(/value="/)[1].split(/["]/)[0]);
    soundcloud_id = soundcloud_url.split(/tracks\//)[1].split(/[&"]/)[0];
    media.type  = "soundcloud";
    media.id    = soundcloud_id;
    success = true;
}
if (success) { return media; }
else { alert("No valid media id detected"); }
return false;
}
  • 0
    Хорошая идея, но она не работает в подавляющем большинстве форматов URL. В том числе не совпадает ни на одном сайте https.
16

Учитывая, что YouTube имеет множество стилей URL, я думаю, что Regex - лучшее решение. Вот мое Regex:

^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*

Группа 3 имеет свой идентификатор YouTube

Пример URL-адресов YouTube (в настоящее время, включая стиль устаревшего стиля встраивания URL) - вышеупомянутое Regex работает над всеми из них:

http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o

Кончик шляпы Ласну

  • 8
    Вы действительно должны вернуться к чертежной доске с этим. Да, это соответствует вышеуказанным URL-адресам правильно. Но он также ошибочно совпадает со многими другими строками, отличными от youtube-url, такими как: "domain.com/embed/file.txt" , "/tv/" и "Has anyone seen my watch?" , Смотрите: мой ответ на похожий вопрос для гораздо более точного решения.
  • 1
    Я понимаю вашу точку зрения: приведенное выше регулярное выражение бесполезно, чтобы ответить на вопрос "Является ли это URL-адресом YouTube?" но это не было моей целью. У меня есть URL-адреса YouTube - я просто извлекаю идентификатор. Да, ваш ответ точный (и охватывает случай использования, которого нет у меня).
Показать ещё 4 комментария
5

ТЛ; др.

Соответствует всем URL-примерам по этому вопросу, а затем и некоторым.

let re = /^(https?:\/\/)?((www\.)?(youtube(-nocookie)?|youtube.googleapis)\.com.*(v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/)|youtu\.be\/)([_0-9a-z-]+)/i;
let id = "https://www.youtube.com/watch?v=l-gQLqv9f4o".match(re)[7];

ID всегда будет в группе совпадений 7.

Живые примеры всех URL-адресов, которые я получил из ответов на этот вопрос: https://regexr.com/3u0d4

Полное объяснение:

Как много ответов/комментариев поднял, есть много форматов для URL видео YouTube. Даже несколько TLD, где они могут показаться "размещенными".

Вы можете посмотреть полный список вариантов, которые я проверял, перейдя по ссылке regexr выше.

Давайте разберем RegExp.

^ Зафиксируйте строку в начале строки. (https?:\/\/)? Факультативные протоколы http://или https://The ? делает предыдущий элемент необязательным, поэтому s и вся группа (все, что заключено в скобки) являются необязательными.

Хорошо, следующая часть - это главное. По сути, у нас есть два варианта: различные версии www.youtube.com/...[id] и сокращенная ссылка youtu.be/[id] версия.

(                                                  // Start a group which will match everything after the protocol and up to just before the video id.
  (www\.)?                                         // Optional www.
  (youtube(-nocookie)?|youtube.googleapis)         // There are three domains where youtube videos can be accessed. This matches them.
  \.com                                            // The .com at the end of the domain. 
  .*                                               // Match anything 
  (v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/) // These are all the things that can come right before the video id. The | character means OR so the first one in the "list" matches.
  |                                                // There is one more domain where you can get to youtube, it the link shortening url which is just followed by the video id. This OR separates all the stuff in this group and the link shortening url.
  youtu\.be\/                                      // The link shortening domain
)                                                  // End of group

Наконец, у нас есть группа для выбора идентификатора видео. Как минимум один символ, который является цифрой, буквой, подчеркиванием или тире.

([_0-9a-z-]+)

Вы можете узнать гораздо больше подробностей о каждой части регулярного выражения, перейдя по ссылке регулярного выражения и увидев, как каждая часть выражения совпадает с текстом в URL.

5

Код Java: (работает для всех URL-адресов:

)

    String url = "http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index";

    String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";
    Pattern compiledPattern = Pattern.compile(regExp);
    Matcher matcher = compiledPattern.matcher(url);
    if(matcher.find()){
        int start = matcher.end();
        System.out.println("ID : " + url.substring(start, start+11));

    }

Для DailyMotion:

String url = "http://www.dailymotion.com/video/x4xvnz_the-funny-crash-compilation_fun";

    String regExp = "/video/([^_]+)/?";
    Pattern compiledPattern = Pattern.compile(regExp);
    Matcher matcher = compiledPattern.matcher(url);
    if(matcher.find()){
        String match = matcher.group();
        System.out.println("ID : " + match.substring(match.lastIndexOf("/")+1));

    }
  • 1
    Не работает для этого URL youtu.be/0zM3nApSvMg
  • 0
    Удалите двойные кавычки вокруг шаблона Regex в коде JavaScript, и он должен работать.
4

Поздно к игре здесь, но я перепутал два превосходных ответа от мантиш и j-w. Во-первых, модифицированное регулярное выражение:

const youtube_regex = /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/

Здесь тестовый код (я добавил оригинальные тестовые примеры для j-w nastier):

 var urls = [
      'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
      'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
      'http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
      'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg',
      'http://youtu.be/0zM3nApSvMg',
      '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
      'http://youtu.be/6dwqZw0j_jY',
      'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
      'http://youtu.be/afa-5HQHiAs',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
      'http://www.youtube.com/watch?v=peFZbP64dsU',
      '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'
  ];

  var failures = 0;
  urls.forEach(url => {
    const parsed = url.match(youtube_regex);
    if (parsed && parsed[2]) {
      console.log(parsed[2]);
    } else {
      failures++;
      console.error(url, parsed);
    }
  });
  if (failures) {
    console.error(failures, 'failed');
  }
  • 1
    Вы должны добавить это в свой тестовый костюм, так как это было проблематично, и ваше регулярное выражение разрешило это для меня: youtu.be/ve4f400859I . Буква v была вырезана в моем предыдущем регулярном выражении
  • 1
    Я получаю ложное положительное значение для http://youtu.be/ если добавляю / он помечает его как действительный. Использование его в (value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Показать ещё 6 комментариев
4

Немного более строгая версия:

^https?://(?:www\.)?youtu(?:\.be|be\.com)/(?:\S+/)?(?:[^\s/]*(?:\?|&)vi?=)?([^#?&]+)

Протестировано:

http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
https://youtu.be/oTJRivZTMLs
http://youtu.be/oTJRivZTMLs&feature=channel
http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
http://www.youtube.com/embed/oTJRivZTMLs?rel=0
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/vi/oTJRivZTMLs&feature=channel
http://youtube.com/?v=oTJRivZTMLs&feature=channel
http://youtube.com/?feature=channel&v=oTJRivZTMLs
http://youtube.com/?vi=oTJRivZTMLs&feature=channel
http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel
4

Я подытожил все предложения, и вот универсальный и короткий ответ на этот вопрос:

if(url.match('http://(www.)?youtube|youtu\.be')){
    youtube_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
}
4

Поскольку идентификаторы видео на YouTube установлены в 11 символов, мы можем просто substring после того, как разделим URL с помощью v=. Тогда мы не зависим от амперсанда в конце.

var sampleUrl = "http://www.youtube.com/watch?v=JcjoGn6FLwI&asdasd";

var video_id = sampleUrl.split("v=")[1].substring(0, 11)

Красиво и просто :)

  • 0
    Не работает, если URL-адрес youtu.be/=someVidId=
  • 0
    Этот буквально дубликат принятого ответа
2

Еще одно:

var id = url.match(/(^|=|\/)([0-9A-Za-z_-]{11})(\/|&|$|\?|#)/)[2]

Он работает с любым URL-адресом, указанным в этом потоке.

Он не будет работать, если YouTube добавит другой параметр с 11 символами base64. До тех пор это простой способ.

2

Немного измененная версия из сообщения mantish:

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]{11,11}).*/;
var match = url.match(regExp);
if (match) if (match.length >= 2) return match[2];
// error

Это предполагает, что код всегда имеет 11 символов. Я использую это в ActionScript, не уверен, что {11,11} поддерживается в Javascript. Также добавлена ​​поддержка & v =.... (на всякий случай)

  • 0
    это был единственный, который работал для URL, с которым я тестировал: youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
  • 0
    идеально. спасибо @Josha 69 ссылка комбинация я тестирую все работает для меня.
Показать ещё 1 комментарий
1

Лучшее решение (с 2019 года), которое я нашел, заключается в том, что:

function YouTubeGetID(url){
   url = url.split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
   return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_\-]/i)[0] : url[0];
}

Я нашел это здесь.

/*
* Tested URLs:
var url = 'http://youtube.googleapis.com/v/4e_kz79tjb8?version=3';
url = 'https://www.youtube.com/watch?feature=g-vrec&v=Y1xs_xPb46M';
url = 'http://www.youtube.com/watch?feature=player_embedded&v=Ab25nviakcw#';
url = 'http://youtu.be/Ab25nviakcw';
url = 'http://www.youtube.com/watch?v=Ab25nviakcw';
url = '<iframe width="420" height="315" src="http://www.youtube.com/embed/Ab25nviakcw" frameborder="0" allowfullscreen></iframe>';
url = '<object width="420" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object>';
url = 'http://i1.ytimg.com/vi/Ab25nviakcw/default.jpg';
url = 'https://www.youtube.com/watch?v=BGL22PTIOAM&feature=g-all-xit';
url = 'BGL22PTIOAM';
*/
1
function parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\/)|(\?v=|\&v=))([^#\&\?]*).*/;
    var match = url.match(regExp);
    if (match && match[8].length==11){
            alert('OK');
    }else{
            alert('BAD');
    }
}

Для тестирования:

https://www.youtube.com/embed/vDoO_bNw7fc - attention first symbol «v» in «vDoO_bNw7fc»

http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
https://youtu.be/oTJRivZTMLs
http://youtu.be/oTJRivZTMLs&feature=channel
http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
http://www.youtube.com/embed/oTJRivZTMLs?rel=0
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/vi/oTJRivZTMLs&feature=channel
http://youtube.com/?v=oTJRivZTMLs&feature=channel
http://youtube.com/?feature=channel&v=oTJRivZTMLs
http://youtube.com/?vi=oTJRivZTMLs&feature=channel
http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel
1

Это определенно требует регулярного выражения:

Скопировать в Ruby IRB:

var url = "http://www.youtube.com/watch?v=NLqASIXrVbY"
var VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/
url.match(VID_REGEX)[1]

Смотрите все тестовые примеры: https://gist.github.com/blairanderson/b264a15a8faaac9c6318

1

Чистый пример ответа Криса Нолета на вопрос Ласнва очень хорош, но я недавно узнал, что если вы попытаетесь найти свою ссылку на YouTube в тексте и поместите некоторый случайный текст после URL-адреса youtube, regexp будет соответствовать более чем необходимому. Улучшенный ответ Криса Нолета:

/^.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]{11,11}).*/
  • 0
    Это соответствует https://embed/K6WmfurFWB . Я не думаю, что это должно.
1

Попробуйте этот вариант -

function getYouTubeIdFromURL($url) 
{
  $pattern = '/(?:youtube.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu.be/)([^"&?/ ]{11})/i';
  preg_match($pattern, $url, $matches);

  return isset($matches[1]) ? $matches[1] : false;
}
1

Мне понравился ответ Сурьи. Просто случай, когда это не сработает...

String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

не работает для

youtu.be/i4fjHzCXg6c  and  www.youtu.be/i4fjHzCXg6c

обновленная версия:

String regExp = "/?.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

работает для всех.

0

Вы можете использовать следующий код, чтобы получить идентификатор видео YouTube из URL:

url = "https://www.youtube.com/watch?v=qeMFqkcPYcg"
VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/
alert(url.match(VID_REGEX)[1]);
0

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

var videoId = function(url) {
   var match = url.match(/v=([0-9a-z_-]{1,20})/i);
   return (match ? match['1'] : false);
};

console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ'));
console.log(videoId('https://www.youtube.com/watch?t=17s&v=dQw4w9WgXcQ'));
console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=17s'));

Эта функция извлекает идентификатор видео, даже если в URL есть несколько параметров.

0

В С# это выглядит так:

public static string GetYouTubeId(string url) {
    var regex = @"(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?|watch)\/|.*[?&amp;]v=)|youtu\.be\/)([^""&amp;?\/ ]{11})";

    var match = Regex.Match(url, regex);

    if (match.Success)
    {
        return match.Groups[1].Value;
    }

    return url;
  }

Не стесняйтесь изменять.

0

Я внес некоторые незначительные изменения в manit regex, чтобы включить все тестовые примеры из J W и ответы matx; так как он не работал на всех из них на начальном этапе. Могут потребоваться дальнейшие изменения, но, насколько я могу судить, это, по крайней мере, охватывает большинство ссылок:

/(?:[?&]vi?=|\/embed\/|\/\d\d?\/|\/vi?\/|https?:\/\/(?:www\.)?youtu\.be\/)([^&\n?#]+)/

var url = ''; // get it from somewhere

var youtubeRegExp = /(?:[?&]vi?=|\/embed\/|\/\d\d?\/|\/vi?\/|https?:\/\/(?:www\.)?youtu\.be\/)([^&\n?#]+)/;
var match = url.match( youtubeRegExp );

if( match && match[ 1 ].length == 11 ) {
    url = match[ 1 ];
} else {
    // error
}

Для дальнейшего тестирования:

http://regexr.com/3fp84

0

Как webstrap, упомянутый в comment:

Это сработало, если видео начиналось с "v", а с youtu.be

Регулярное выражение содержит небольшую ошибку \??v?=?, это должно быть просто на смотрите, иначе вы отфильтровываете 'v', если идентификатор начинается с 'v'. так что это должно сделать трюк

/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v?=?))([^#\&\?]*).*/

0
function youtube_parser(url){
    var match = url.match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/);
    return (match&&match[7].length==11)?match[7]:false;
}

Самый короткий и эффективный

  • 0
    не правильно, терпит неудачу против youtube.com/e/dQw4w9WgXcQ, поэтому, пожалуйста, возьмите эффективную часть :)
0
var video_url = document.getElementById('youtubediv').value;
        if(video_url!=""){
        ytid(video_url);
        document.getElementById("youtube").setAttribute("src","http://www.youtube.com/embed/"+ytid(video_url));
        }
        function ytid(video_url){
            var video_id = video_url.split('v=')[1];
            var ampersandPosition = video_id.indexOf('&');
            if(ampersandPosition != -1) {
                video_id = video_id.substring(0, ampersandPosition);
            }
            return video_id;
        }

Надеюсь, это поможет

0

Простое регулярное выражение, если у вас есть полный URL-адрес, прост.

results = url.match("v=([a-zA-Z0-9]+)&?")
videoId = results[1] // watch you need.
0

Мы знаем, что эти символы "? v" "никогда не могут появляться больше, чем одни, но" v "может каким-то образом проявляться в Id Id, поэтому мы используем"? v = "в качестве разделителя. См. Работа здесь

//Get YouTube video Id From Its Url

     $('button').bind('click',function(){
var 
url='http://www.youtube.com/watch?v=u8nQa1cJyX8',
videoId = url.split('?v='),//Split data to two
YouTubeVideoId=videoId[1];
alert(YouTubeVideoId);return false;

});

<button>Click ToGet VideoId</button>
0
videoId = videoUrl.split('v=')[1].substring(0,11);
  • 0
    Там нет никакой гарантии на 11 символов длины.
0

Ну, способ сделать это с помощью простого разбора будет: получить все, начиная с первого знака =, до первого знака &.

Я думаю, что у них был похожий ответ:

Разбор идентификатора Vimeo с использованием JavaScript?

  • 2
    А что если URL не содержит & ?
  • 0
    Затем вы должны найти эквивалентный разделитель. Например, первый URL, который вы нам дали, это знак &. На втором URL-адресе конец строки является разделителем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню