Bagaimana cara mendapatkan ID video YouTube dari URL?

257

Saya ingin mendapatkan v=iddari URL YouTube dengan JavaScript (tanpa jQuery, JavaScript murni).

Contoh format URL YouTube

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

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

Atau format YouTube lainnya yang berisi ID video di URL.

Hasil dari format ini

u8nQa1cJyX8

Adam
sumber
Pertanyaan itu hanya untuk format seperti yang kedua. Tetapi saya menemukan jawaban yang menarik di sana, terima kasih telah membagikannya.
Adam
Ada ungkapan reguler untuk itu: http://pregcopy.com/exp/27
Exos
Tidak dapat mengambil kredit untuk itu, tetapi saya menemukan ini cukup luas: gist.github.com/FinalAngel/1876898 . Bahkan menangkap url beragam seperti youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGo dan youtube.com/v/1p3vcRhsYGo
Simon
2
Mulai 2015: lompat ke jawaban ini . Jawaban lainnya sudah kedaluwarsa.
Lenar Hoyt

Jawaban:

109

Anda tidak perlu menggunakan ekspresi reguler untuk ini.

var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}
Jacob Relkin
sumber
ini adalah fungsi yang berguna untuk membuatnya berfungsi di tempat yang Anda inginkan berdasarkan kode ini. 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); } lansiran (video_id); kembalikan video_id; }
Gino
9
tidak menangani URL yang disematkan
Serge
14
juga tidak menangani url yang dihasilkan 'bagikan'https://youtu.be/{{video_id}}
hamncheez
2
Regex ini berfungsi baik dengan berbagi youtube dan menonton url. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten
410

Saya membuat peningkatan pada Regex yang disediakan oleh "jeffreypriebe" karena dia membutuhkan semacam URL YouTube adalah URL video ketika mereka melihat melalui saluran.

Ya tidak, tapi ini adalah fungsi yang saya miliki.

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

Ini adalah jenis URL yang didukung

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

Dapat ditemukan di [http://web.archive.org/web/20160926134334/] http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube

Lasnv
sumber
6
Regex berisi sedikit bug \ ?? v? =? ini seharusnya berada di bagian arloji, jika tidak Anda akan memfilter 'v' jika id dimulai dengan 'v'. jadi ini harus melakukan trik /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
webstrap
69
Bahkan lebih bersih: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ Kemudian gunakan match[1]sebagai gantinya match[7](yang tampak agak sewenang-wenang bagi saya). Juga memperbaiki bug yang ditunjukkan oleh WebDev.
Chris Nolet
3
Berapa lama hingga ID YouTube panjangnya 12 karakter?
Lenar Hoyt
1
Tahukah Anda bahwa itu tidak benar-benar sempurna, jika Anda meletakkan sesuatu.com/watch?v=jn40gqhxoSY Rasanya ini url youtube
Gino
1
Siapa pun dapat memperpanjang reqex ini dan dengan demikian orang yang mengeluh tidak masuk akal.
Lecha Bisultanov
241

Saya menyederhanakan jawaban Lasnv sedikit.

Itu juga memperbaiki bug yang dijelaskan WebDeb.

Ini dia:

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
}

Berikut ini adalah tautan regexer untuk bermain: http://regexr.com/3dnqv

mantish
sumber
2
just a head up: ini hanya boleh digunakan ketika Anda tahu bahwa Anda berurusan dengan url youtube. Saya (secara keliru) menggunakannya untuk memverifikasi url sebagai youtube, yang menyebabkan positif palsu, misalnya ini lewat: 'v / 2059-9080-5437'
fabi
3
Sekarang saya menggunakan Regex berbeda yang juga memeriksa domain youtube. Saya tidak yakin apakah saya harus memperbarui jawabannya karena ini adalah perubahan besar: /^.*(youtu.be\/| youtube (-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |. * v =)) ([\ w -] {11}). * /
mantish
4
Kapan YouTube akan beralih ke 12 karakter untuk ID video?
Lenar Hoyt
bukankah seharusnya titik di "youtu.be" diloloskan?
Alex
kamu benar @bitbit Terima kasih. Meskipun biasanya berhasil juga tanpa menghindarinya.
mantish
85

Tak satu pun dari ini bekerja di wastafel dapur pada 1/1/2015, terutama URL tanpa http / s protokal dan dengan domain youtube-nocookie. Jadi, inilah versi modifikasi yang bekerja pada semua berbagai versi Youtube ini:

// 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
sumber
2
Patut dicatat bahwa banyak solusi di atas tidak mencakup banyak url yang valid, skrip uji sangat membantu, +1!
Dicampur
2
Perhatikan bahwa ini akan dibodohi oleh sesuatu seperti "www.engadget.com/watch?v=dQw4w9WgXcQ", bukan berarti itu akan menjadi masalah
binaryfunt
Ini berfungsi, tetapi tidak dapat memperbaiki masalah yang timbul teks dengan beberapa url youtube. Lihat ini regex101.com/r/qK5qJ5/1 . Seharusnya tidak mengganti url kedua.
Ashish
2
Jika Anda tidak ingin ID kosong cocok : ^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(mis. Youtube.com/watch?v= tidak akan cocok)
zurfyx
Apa yang Anda maksud dengan "Tak satu pun dari ini bekerja di wastafel dapur"?
rmutalik
26
/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/

Diuji pada:

  • 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

Terinspirasi oleh jawaban lain ini .

xronosiam
sumber
9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). * akan memberikan Anda hasilnya di grup 1
Marc
20

Mengingat YouTube memiliki beragam gaya URL, saya pikir Regex adalah solusi yang lebih baik. Ini Regex saya:

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

Grup 3 memiliki ID YouTube Anda

Contoh URL YouTube (saat ini, termasuk "legacy embed URL style") - Regex di atas berfungsi pada semuanya:

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

Tip hat ke Lasnv

jeffreypriebe
sumber
9
Anda benar-benar harus kembali ke papan gambar dengan yang ini. Ya itu cocok dengan URL di atas dengan benar. Tetapi juga keliru cocok banyak string non-youtube-url lainnya seperti: "domain.com/embed/file.txt", "/tv/"dan "Has anyone seen my watch?". Lihat: jawaban saya untuk pertanyaan serupa untuk solusi yang jauh lebih tepat.
ridgerunner
1
Saya mengerti maksud Anda: regex di atas tidak berguna untuk menjawab pertanyaan "Apakah ini URL YouTube?" tapi itu bukan tujuan saya. Saya memiliki URL YouTube - Saya hanya mengekstraksi ID. Ya, jawaban Anda solid (dan mencakup use case yang tidak saya miliki).
jeffreypriebe
Anda memiliki bug yang sama yang saya sebutkan di atas dengan id yang dimulai dengan 'v'
webstrap
Terima kasih @WebDev - tahukah Anda jika YouTube pernah memasukkan av di ID (atau memulai ID dengan "v")?
jeffreypriebe
1
Masih berfungsi hingga hari ini (2013-01-25). Berikut ini contoh tindakannya: jsfiddle.net/bcmoney/yBP4J
bcmoney
17

Saya membuat fungsi yang menguji input pengguna untuk Youtube, Soundcloud atau Vimeo embed ID's, untuk dapat membuat desain yang lebih berkelanjutan dengan media tertanam. Fungsi ini mendeteksi dan mengembalikan objek dengan dua properti: "type" dan "id". Jenis dapat berupa "youtube", "vimeo" atau "soundcloud" dan properti "id" adalah id media yang unik.

Di situs saya menggunakan dump textarea, di mana pengguna dapat menempelkan semua jenis tautan atau kode embed, termasuk embedded iFrame baik vimeo dan 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;
}
Joakim
sumber
Gagasan bagus, tetapi tidak berfungsi pada sebagian besar format URL. Termasuk tidak cocok di situs https.
NickG
13

Terlambat dalam permainan di sini, tapi aku telah menghimpun dua tanggapan yang sangat baik dari mantish dan jw. Pertama, regex yang dimodifikasi:

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

Ini kode tesnya (saya sudah menambahkan test case asli mantish ke jw's 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');
  }

Versi eksperimental untuk menangani url m.youtube yang disebutkan dalam komentar:

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

Itu perlu parsed[2]diubah menjadi parsed[3]di dua tempat dalam tes (yang kemudian diteruskan dengan m.youtubeurl ditambahkan ke tes). Beri tahu saya jika Anda melihat masalah.

podperson
sumber
1
Anda harus menambahkan ini dalam setelan pengujian Anda karena bermasalah dan regexp Anda menyelesaikannya untuk saya: youtu.be/ve4f400859I . Huruf v dilucuti di regexp saya sebelumnya
Mark Odey
1
Saya mendapatkan postive palsu karena http://youtu.be/jika saya menambahkannya /menandakannya valid. Menggunakannya di(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d
Terima kasih atas komentarnya. Saya belum memperbarui contoh saya (belum punya waktu untuk menguji) sehingga siapa pun yang menggunakan kode saya harap dicatat :-)
podperson
bagaimana dengan url type = m.youtube.com
Mehul Thakkar
@MehulThakkar apakah mereka mirip dengan url youtube.com?
podperson
11

tl; dr.

Cocokkan semua contoh URL pada pertanyaan ini dan kemudian beberapa.

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 akan selalu ada di grup pertandingan 7.

Contoh langsung dari semua URL yang saya ambil dari jawaban atas pertanyaan ini: https://regexr.com/3u0d4

Penjelasan lengkap:

Karena banyak jawaban / komentar telah muncul, ada banyak format untuk URL video youtube. Bahkan beberapa TLD di mana mereka dapat "dihosting".

Anda dapat melihat daftar variasi lengkap yang saya periksa dengan mengikuti tautan regexr di atas.

Mari kita hancurkan RegExp.

^Kunci string ke awal string. (https?:\/\/)?Protokol opsional http: // atau https: // ?Membuat item sebelumnya opsional sehingga sdan kemudian seluruh grup (apa pun yang terlampir dalam seperangkat tanda kurung) adalah opsional.

Ok, bagian selanjutnya ini adalah dagingnya. Pada dasarnya kami memiliki dua opsi, berbagai versi www.youtube.com/...[id] dan tautan yang disingkat menjadi versi 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

Akhirnya kami memiliki grup untuk memilih ID video. Setidaknya satu karakter yang berupa angka, huruf, garis bawah, atau tanda hubung.

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

Anda dapat menemukan lebih banyak detail tentang setiap bagian dari regex dengan menuju tautan regexr dan melihat bagaimana setiap bagian dari ekspresi cocok dengan teks di url.

tsdorsey
sumber
10

Solusi terbaik (dari 2019-2020) yang saya temukan adalah:

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

Saya menemukannya di sini .

/*
* 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';
*/
Vlad
sumber
TypeScript: const youTubeGetID = (url: string) => {const [a,, b] = url .replace (/ (> | <) / gi, '') .split (/ (vi \ / | v = | \ /v\/| yourout .be//|\/embed\/)/); if (b! == undefined) {return b.split (/ [^ 0-9a-z _-] / i) [0]; } else {mengembalikan a; }};
Vlad
gagal untuk v = nfDGK_WSFro
Deen John
6

Karena id video YouTube ditetapkan menjadi 11 karakter , kami dapat dengan mudah substringsetelah kami membagi url dengan v=. Maka kita tidak bergantung pada ampersand pada akhirnya.

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

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

Bagus dan sederhana :)

Menandai
sumber
Yang ini secara harfiah merupakan duplikat dari jawaban yang diterima
brasofilo
5

Saya telah merangkum semua saran dan inilah jawaban universal dan singkat untuk pertanyaan ini:

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

Kode Java: (Berfungsi untuk semua 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));

    }

Untuk 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));

    }
surya
sumber
1
Hapus tanda kutip ganda dari sekitar pola Regex dalam kode JavaScript dan itu akan berfungsi.
TheDude
4

Versi yang sedikit lebih ketat:

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

Diuji pada:

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
sumber
4

Anda dapat menggunakan kode berikut untuk mendapatkan ID video YouTube dari 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]);
K. Ayoub
sumber
Saya memiliki masalah dengan semua contoh regex lainnya tetapi yang satu ini bekerja secara efektif pada 3 opsi berbagi yang digunakan orang di desktop. url dari bilah alamat, url dari tombol bagikan dan url dari tombol bagikan inline. Terima kasih!!!
Maarten
2

Versi yang sedikit berubah dari yang ditulis:

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

Ini mengasumsikan kode selalu 11 karakter. Saya menggunakan ini dalam ActionScript, tidak yakin apakah {11,11} didukung dalam Javascript. Juga menambahkan dukungan untuk & v = .... (untuk berjaga-jaga)

Josha
sumber
ini adalah satu-satunya yang berfungsi untuk url yang saya uji dengan: youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
Dominic
sempurna. terima kasih @Josha 69 kombinasi tautan saya menguji semua bekerja untuk saya.
gokhan
2

Ini jelas membutuhkan regex:

Salin ke 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]

Lihat untuk semua kasus uji: https://gist.github.com/blairanderson/b264a15a8faaac9c6318

Blair Anderson
sumber
2

Satu lagi:

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

Ini berfungsi dengan URL apa pun yang ditampilkan di utas ini.

Ini tidak akan berfungsi ketika YouTube menambahkan beberapa parameter lain dengan 11 karakter base64. Sampai saat itu adalah cara yang mudah.

Pykiss
sumber
2

Saya membuat fungsi kecil untuk mengekstrak id video dari url Youtube yang dapat dilihat di bawah ini.

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

Fungsi ini akan mengekstrak id video bahkan jika ada beberapa parameter dalam url.

Jake
sumber
2

Ini bisa mendapatkan id video dari semua jenis tautan youtube

var url= 'http://youtu.be/0zM3nApSvMg';
var urlsplit= url.split(/^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*/);
console.log(urlsplit[3]);
Praveen Kumar
sumber
1

Saya menyukai jawaban Surya .. Hanya kasus di mana itu tidak akan berhasil ...

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

tidak bekerja untuk

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

versi terbaru:

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

bekerja untuk semua.

pengguna2200660
sumber
1

Coba yang ini -

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;
}
Rohit Suthar
sumber
1

Chris Nolet contoh bersih jawaban Lasnv sangat baik, tetapi saya baru-baru ini menemukan bahwa jika Anda mencoba untuk menemukan tautan youtube Anda dalam teks dan meletakkan beberapa teks acak setelah url youtube, regexp cocok dengan cara yang lebih dari yang dibutuhkan. Jawaban Chris Nolet yang ditingkatkan:

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

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

Untuk pengujian:

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
Agafonov
sumber
0

Nah, cara melakukannya dengan penguraian sederhana adalah: dapatkan semuanya dimulai setelah yang pertama = masuk ke yang pertama & masuk.

Saya pikir mereka punya jawaban yang serupa di sini:

Mem-parsing Vimeo ID menggunakan JavaScript?

karlphillip
sumber
2
Dan bagaimana jika URL tidak mengandung &?
Adam
Maka Anda harus menemukan apa pembatas setara. Misalnya, URL pertama yang Anda beri kami tanda &. Pada URL kedua, ujung string adalah pembatas.
karlphillip
0

Kita tahu karakter-karakter ini "? V =" tidak pernah dapat muncul lebih dari yang tetapi 'v' dapat muncul entah bagaimana di Id itu sendiri sehingga kami menggunakan "? V =" sebagai pembatas. Lihat Bekerja di Sini

//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
sumber
0

Regex sederhana jika Anda memiliki URL lengkap, tetap sederhana.

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

semoga bisa membantu

Roderick Domondon
sumber
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;
}

Terpendek dan Efisien

Wasim A.
sumber
tidak benar, gagal vs youtube.com/e/dQw4w9WgXcQ jadi silakan ambil bagian yang efisien :)
alecellis1985
0

Seperti webstrap yang disebutkan dalam komentar :

Ini berfungsi jika video dimulai dengan "v" dan itu dari youtu.be

Regex berisi sedikit bug yang \??v?=?seharusnya ada di bagian pengawasan, jika tidak, Anda akan memfilter 'v'jika id dimulai dengan a 'v'. jadi ini harus melakukan triknya

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

Shuher
sumber