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

257

Я хочу получить v=idURL-адрес YouTube с помощью 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 с использованием регулярных выражений
Марк Байерс
Этот вопрос только для форматов, как мой второй. Но я нашел там интересный ответ, спасибо, что поделился им.
Адам
Есть регулярное выражение для этого: http://pregcopy.com/exp/27
Exos
Не могу поверить в это, но я нашел это довольно обширным: gist.github.com/FinalAngel/1876898 . Он даже ловит такие разные URL-адреса, как youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGo и youtube.com/v/1p3vcRhsYGo
Саймон,
2
По состоянию на 2015 год: перейдите к этому ответу . Другие ответы устарели.
Ленар Хойт

Ответы:

109

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

var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}
Джейкоб Релкин
источник
это полезная функция, чтобы заставить ее работать там, где вы хотите, основываясь на этом коде. 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; }
Gino
9
не обрабатывает встроенные URL-адреса
Серж
14
также не обрабатывает сгенерированные URL- https://youtu.be/{{video_id}}
адреса
2
Это регулярное выражение хорошо работает с URL-адресами YouTube и YouTube. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Диптен
410

Я сделал усовершенствование 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

Lasnv
источник
6
Регулярное выражение содержит небольшую ошибку \ ?? v? =? это должно быть только в части наблюдения, иначе вы бы отфильтровали 'v', если идентификатор начинается с 'v'. так что это должно сделать трюк /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
webstrap
69
Даже чище: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ тогда используйте match[1]вместо match[7](что показалось мне немного произвольным). Также исправляет ошибку, указанную WebDev.
Крис Нолет
3
Как долго, пока идентификаторы YouTube не будут содержать 12 символов?
Ленар Хойт
1
Знаете ли вы, что это не совсем идеально, если вы положили что-
Gino
1
Любой может продлить это требование, и поэтому люди, жалующиеся, не имеют никакого смысла.
Леха Бисултанов
241

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

Это также исправляет ошибку, которую описывает 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

mantish
источник
2
только на голову: это следует использовать только тогда, когда вы знаете, что имеете дело с URL-адресом YouTube. Я (ошибочно) использовал его для проверки URL как YouTube, что вызвало ложные срабатывания, например, это проходит: 'v / 2059-9080-5437'
Фаби
3
Сейчас я использую другой Regex, который также проверяет домен YouTube. Я не уверен, что мне следует обновить ответ, так как это большое изменение: /^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |. * v =)) ([\ w -] {11}). * /
mantish
4
Когда YouTube перейдет на 12 символов для идентификатора видео?
Ленар Хойт
не следует ли экранировать точку в "youtu.be"?
Alex
Вы правы @jitbit Спасибо. Хотя обычно это работает так же хорошо, не избегая этого.
mantish
85

По состоянию на 01.01.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]);
}
JW
источник
2
Стоит отметить, что многие из вышеперечисленных решений не охватывают этот широкий набор действительных URL, тестовый скрипт очень полезен, +1!
Blented
2
Обратите внимание, что это будет одурачено чем-то вроде «www.engadget.com/watch?v=dQw4w9WgXcQ», а не то, что это может быть проблемой, хотя
binaryfunt
Это работает, но не может решить проблему, связанную с текстом с несколькими URL- адресами YouTube. См. Этот regex101.com/r/qK5qJ5/1 . Он не должен заменять второй URL.
Ашиш
3
Если вы не хотите, чтобы пустой идентификатор^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*
совпадал
Что вы подразумеваете под "Ни один из них не работал на кухонной раковине"?
rmutalik
26
/^.*(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

Вдохновлен этим другим ответом .

xronosiam
источник
9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). * даст Вы результат в группе 1
Marc
20

Учитывая, что у 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

Наконечник шляпы к Lasnv

jeffreypriebe
источник
9
Вам действительно нужно вернуться к чертежной доске с этим. Да, это соответствует вышеуказанным URL-адресам правильно. Но это также ошибочно соответствует множеству других строк , не YouTube , URL - адреса , например: "domain.com/embed/file.txt", "/tv/"и "Has anyone seen my watch?". Смотрите: мой ответ на похожий вопрос для гораздо более точного решения.
Ridgerunner
1
Я понимаю вашу точку зрения: приведенное выше регулярное выражение бесполезно, чтобы ответить на вопрос "Является ли это URL-адресом YouTube?" но это не было моей целью. У меня есть URL-адреса YouTube - я просто извлекаю идентификатор. Да, ваш ответ точный (и охватывает случай использования, которого нет у меня).
Jeffreypriebe
у вас та же ошибка, о которой я упоминал выше, с идентификаторами, начинающимися с 'v'
webstrap
Спасибо @WebDev - знаете ли вы, если YouTube когда-либо помещает av в идентификатор (или начинает идентификатор с «v»)?
Jeffreypriebe
1
Работает до сих пор (2013-01-25). Вот пример этого в действии: jsfiddle.net/bcmoney/yBP4J
bcmoney
17

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

На сайте я использую дамп textarea, где пользователь может вставить любой тип ссылки или встроенный код, включая iFrame-embedding как 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;
}
Йоаким
источник
Хорошая идея, но она не работает в подавляющем большинстве форматов URL. В том числе не совпадает ни на одном сайте https.
NickG
13

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

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

Вот тестовый код (я добавил оригинальные тестовые примеры mantish к более неприятным jw):

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

Экспериментальная версия для обработки m.youtube URLs , упомянутый в комментариях:

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

Его необходимо parsed[2]заменить на parsed[3]два места в тестах (которые затем проходят с m.youtubeдобавленными в тесты URL-адресами). Дайте мне знать, если увидите проблемы.

podperson
источник
1
Вы должны добавить это в свой тестовый костюм, так как это было проблематично, и ваше регулярное выражение разрешило это для меня: youtu.be/ve4f400859I . Буква v была
вырезана
1
Я получаю ложное положительное значение, потому что http://youtu.be/если я добавлю, /он помечает его как действительный. Используя это в(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d
Спасибо за комментарии. Я еще не обновил свой пример (у меня нет времени на тестирование), поэтому, кто использует мой код, примите к сведению :-)
podperson
как насчет URL типа =
m.youtube.com
@MehulThakkar они похожи на URL-адреса youtube.com?
podperson
11

ТЛ; др.

Сопоставляет все примеры 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's 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-]+)

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

tsdorsey
источник
10

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

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';
*/
Влад
источник
TypeScript: const youTubeGetID = (url: string) => {const [a,, b] = url .replace (/ (> | <) / gi, '') .split (/ (vi \ / | v = | \ /v\/|youtu\.be\/|\/embed\/)/); if (b! == undefined) {вернуть b.split (/ [^ 0-9a-z _-] / i) [0]; } else {return a; }};
Влад
терпит неудачу для v = nfDGK_WSFro
Дин Джон
6

Поскольку идентификаторы видео на 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)

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

отметка
источник
Этот буквально является дубликатом принятого ответа
brasofilo
5

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

if(url.match('http://(www.)?youtube|youtu\.be')){
    youtube_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
}
romaninsh
источник
5

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

  1. http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
  2. http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
  3. http://youtube.googleapis.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0
  4. http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
  5. http://www.youtube.com/embed/0zM3nApSvMg?rel=0 "
  6. http://www.youtube.com/watch?v=0zM3nApSvMg
  7. http://youtu.be/0zM3nApSvMg
  8. http://www.youtube.com/watch?v=0zM3nApSvMg/
  9. http://www.youtube.com/watch?feature=player_detailpage&v=8UVNT4wvIGY

)

    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
Удалите двойные кавычки вокруг шаблона Regex в коде JavaScript, и он должен работать.
TheDude
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
m4tx
источник
4

Вы можете использовать следующий код, чтобы получить идентификатор видео 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]);
К. Аюб
источник
У меня были проблемы со всеми другими примерами регулярных выражений, но этот эффективно работает с 3 вариантами общего доступа, которые используют люди на десктопах. URL-адрес из адресной строки, URL-адрес от кнопки общего доступа и URL-адрес от встроенной кнопки общего доступа. Спасибо!!!
Мартен
2

Слегка измененная версия от одного опубликованного сообщения:

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 = .... (на всякий случай)

Josha
источник
это был единственный, который работал для URL, с которым я тестировал: youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
Доминик
идеальный. спасибо @Josha 69 ссылка комбинация я тестирую все работает для меня.
гохан
2

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

Скопируйте в 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

Блэр Андерсон
источник
2

Еще один:

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

Работает с любым URL, показанным в этой теме.

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

pykiss
источник
2

Я сделал небольшую функцию для извлечения идентификатора видео из 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 есть несколько параметров.

Джейк
источник
2

Это может получить идентификатор видео из любого типа ссылок на YouTube

var url= 'http://youtu.be/0zM3nApSvMg';
var urlsplit= url.split(/^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*/);
console.log(urlsplit[3]);
Правин Кумар
источник
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=)";

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

user2200660
источник
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

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

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

mindaug
источник
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
Агафонов
источник
0

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

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

Разбор Vimeo ID с использованием JavaScript?

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

Мы знаем, что эти символы «? V =» никогда не могут появляться больше, чем символы, но «v» может появляться как-то в самом 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>
ShapCyber
источник
0

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

results = url.match("v=([a-zA-Z0-9]+)&?")
videoId = results[1] // watch you need.
Gubatron
источник
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
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;
}

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

Васим А.
источник
не верно, терпит неудачу против youtube.com/e/dQw4w9WgXcQ, поэтому, пожалуйста, возьмите эффективную часть :)
alecellis1985
0

Как упомянуто в комментарии :

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

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

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

Shuher
источник