Як отримати ідентифікатор відео YouTube з URL-адреси?


256

Я хочу отримати 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



Це питання стосується лише таких форматів, як мій другий. Але я знайшов там цікаву відповідь, дякую, що поділився нею.
Адам

Для цього є регулярний вираз: http://pregcopy.com/exp/27
Exos

Не можу взяти на це жодної заслуги, але я вважаю це досить великим: gist.github.com/FinalAngel/1876898 . Він навіть ловить URL-адреси настільки різноманітні, як youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGo та youtube.com/v/1p3vcRhsYGo
Simon

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); функція ytid (video_url) {var video_id = video_url.split ('v =') [1]; var ampersandPosition = video_id.indexOf ('&'); якщо (ampersandPosition! = -1) {video_id = video_id.substring (0, ampersandPosition); } оповіщення (video_id); повернути video_id; }
Gino

9
не обробляє вбудовані URL-адреси
Серж

14
також не обробляє URLhttps://youtu.be/{{video_id}}
адреси,

2
Цей регулярний вираз добре працює з програмою YouTube та перегляду URL-адрес. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten

410

Я зробив удосконалення до Regex, наданого "jeffreypriebe", оскільки йому потрібна така собі 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\ =?)) ([^ # \ & \?] *). * /
webstrap

69
Ще чистіше: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ Тоді використовуйте match[1]замість match[7](що мені здавалося трохи довільним). Також виправляє помилку, на яку вказав WebDev.
Кріс Нолет

3
Скільки часу, поки ідентифікатори YouTube не набудуть 12 символів?
Ленар Хойт

1
Чи знаєте ви , що це на самому ділі не досконалим, якщо ви поставите anything.com/watch?v=jn40gqhxoSY Це здається , що це YouTube URL
Джино

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


2
лише головою вгору: це слід використовувати лише тоді, коли ви знаєте, що маєте справу з URL-адресою YouTube. Я (помилково) використав це для перевірки URL-адрес як youtube, що спричинило помилкові позитиви, наприклад, це передає: 'v / 2059-9080-5437'
fabi

3
Зараз я використовую інший Regex, який також перевіряє наявність домену youtube. Я не впевнений, чи варто мені оновити відповідь, оскільки це велика зміна: /^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |. * v =)) ([\ w -] {11}). * /
богомол

4
Коли YouTube перейде на 12 символів для ідентифікатора відео?
Ленар Хойт

не слід уникати крапки у "youtu.be"?
Олексій

ви праві @jitbit Дякую. Хоча зазвичай це добре працює, не уникаючи цього.
богомол

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

2
Варто зазначити, що багато з перерахованих вище рішень не охоплюють цю широку партію дійсних URL-адрес, тестовий сценарій дуже корисний, +1!
опущений

2
Зауважте, що це буде обдурене чимось на кшталт "www.engadget.com/watch?v=dQw4w9WgXcQ", не те, що це, ймовірно, буде проблемою
binaryfunt

Це працює, але не вдалося виправити проблему, що виникає з текстом із кількома URL- адресами YouTube . Він не повинен замінювати другий URL.
Ашиш

2
Якщо ви не хочете, щоб порожній ідентифікатор^.*(?:(?: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=uk_US&rel=0

Натхненний цією іншою відповіддю .


9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | вставити \ / | v =) ([^ # \ & \?] *). * дасть ви результат в 1 -й групі
Marc

19

Зважаючи на те, що 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

Капелюшна порада до Ласнв


9
Вам справді потрібно повернутися до дошки для малювання з цією. Так, він правильно відповідає вказаним вище URL-адресам. Але це також помилково відповідає безлічі інших рядків , НЕ YouTube , URL - адреси , наприклад: "domain.com/embed/file.txt", "/tv/"і "Has anyone seen my watch?". Дивіться: моя відповідь на подібне питання для набагато більш точного рішення.
райджернер

1
Я бачу вашу думку: вищевказаний вираз є марним відповідати на запитання "Це URL-адреса YouTube?" але це не було моєю метою. У мене є URL-адреси YouTube - я лише видобуваю ідентифікатор. Так, ваша відповідь тверда (і стосується випадків використання, яких у мене немає).
jeffreypriebe

у вас є та сама помилка, про яку я згадав вище, ідентифікатори починаються з 'v'
webstrap

Дякуємо @WebDev - чи знаєте ви, чи YouTube коли-небудь ставить av в ідентифікатор (або запускає ідентифікатор з "v")?
jeffreypriebe

1
Все ще працює на сьогодні (25.01.2013). Ось приклад цього в дії: jsfiddle.net/bcmoney/yBP4J
bcmoney

17

Я створив функцію, яка перевіряє введення користувачів для вбудованих ідентифікаторів Youtube, Soundcloud або Vimeo, щоб мати змогу створити більш тривалий дизайн із вбудованими носіями. Ця функція виявляє та повертає об'єкт із двома властивостями: "type" та "id". Тип може бути "youtube", "vimeo" або "soundcloud", а властивість "id" - це унікальний ідентифікатор медіа.

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

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

Експериментальна версія для обробки URL-адрес m.youtube, згаданих у коментарях:

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

Це потрібно parsed[2]змінити на parsed[3]два місця в тестах (які вони потім передають із m.youtubeдоданими до тестів URL-адресами). Повідомте мене, якщо ви бачите проблеми.


1
Ви повинні додати цю у свій тестовий костюм, оскільки це було проблематично, і ваш regexp вирішив це для мене: 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
Mehul Thakkar

@MehulThakkar Чи схожі вони на URL-адреси youtube.com?
підперсон

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];

Ідентифікатор завжди буде у групі 7 матчу.

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

Повне пояснення:

Оскільки було запропоновано багато відповідей / коментарів, існує багато форматів для URL-адрес відео YouTube. Навіть кілька TLD, де вони можуть бути "розміщеними".

Ви можете переглянути повний список варіантів, проти яких я перевірив, перейшовши посилання regexr вище.

Дозволяє розбити RegExp.

^Зафіксуйте рядок до початку рядка. (https?:\/\/)?Необов'язкові протоколи http: // або https: // ?Попередній елемент є необов'язковим, таким чиномs а потім вся група (все, що вкладено в набір дужок) є необов'язковою.

Гаразд, наступна частина - це м'ясо. В основному у нас є два варіанти, різні версії www.youtube.com/... evidenceid] та посилання скорочено youtu.be/ evidenceid] версію.

(                                                  // 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-адресі.


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) {return 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];
}

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=uk_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

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 = .... (про всяк випадок)


це єдиний, хто працював над 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 базовими64 символами. До цього це простий шлях.


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=)";

працює для всіх.


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, regexp відповідає набагато більше, ніж потрібно. Удосконалена відповідь Кріса Нолета:

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


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 за допомогою JavaScript?


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>

0

Простий регулярний вираз, якщо у вас є повна URL-адреса, зберігайте його просто.

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

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

Як згадується в коментарі webstrap :

Це спрацювало, якщо відео починається з "v", і це з youtu.be

У регулярному виразі міститься невелика помилка, \??v?=?це має бути просто в частині перегляду, інакше ви будете фільтрувати a, 'v'якщо ідентифікатор починається з а 'v'. тому це повинно зробити трюк

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.