Bir URL'den YouTube video kimliğini nasıl alabilirim?


257

v=idJavaScript ile YouTube'un URL'sini almak istiyorum (jQuery, saf JavaScript yok).

Örnek YouTube URL biçimleri

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

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

Veya URL'de video kimliği içeren başka bir YouTube biçimi.

Bu biçimlerden sonuç

u8nQa1cJyX8



Bu soru sadece ikincisi gibi formatlar içindir. Ama orada ilginç bir cevap buldum, paylaştığın için teşekkürler.
Adam

Bunun için düzenli bir ifade var: http://pregcopy.com/exp/27
Exos

Bunun için herhangi bir kredi alamıyorum, ama oldukça kapsamlı buldum: gist.github.com/FinalAngel/1876898 . Hatta URL'leri youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGo ve youtube.com/v/1p3vcRhsYGo
Simon

2
2015 yılı itibariyle: atlamak Bu cevap . Diğer cevaplar güncel değil.
Lenar Hoyt

Yanıtlar:


109

Bunun için normal bir ifade kullanmanıza gerek yoktur.

var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}

bu, bu koda dayalı olarak istediğiniz yerde çalışmasını sağlamak için kullanışlı bir işlevdir. var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata '; ytid (video_url); işlev 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); } uyarı (video_id); video_id döndür; }
Gino

9
gömülü URL'leri işlemez
Serge

14
Ayrıca oluşturulan 'paylaş' urls işlemez-https://youtu.be/{{video_id}}
hamncheez

2
Bu normal ifade youtube paylaşımı ve izleme url'si ile iyi çalışır. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten

410

"Jeffreypriebe" tarafından sağlanan Regex üzerinde bir iyileştirme yaptım çünkü bir kanaldan bakarken videoların URL'sidir.

Hayır, ama bu silahlandırdığım işlev.

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

Bunlar desteklenen URL türleridir

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 adresinde bulunabilir.


6
Normal ifade küçük bir hata içeriyor \ ?? v? =? bu sadece saat kısmında olmalıdır, aksi takdirde id 'v' ile başlıyorsa 'v' ye filtre uygularsınız. bu yüzden bu hile /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
webstrap

69
Hatta daha temiz: (Benim için biraz keyfi görünüyordu) yerine /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ kullanın . Ayrıca WebDev tarafından belirtilen hatayı giderir. match[1]match[7]
Chris Nolet

3
YouTube kimlikleri 12 karakter uzunluğunda ne kadar sürer?
Lenar Hoyt

1
Eğer gerçekten mükemmel değil biliyor muydunuz sen koyarsanız, anything.com/watch?v=jn40gqhxoSY O youtube url olduğunu düşünüyorum
Gino

1
Herkes bu reqex'i uzatabilir ve bu nedenle şikayet eden insanlar herhangi bir anlam ifade etmez.
Lecha Bisultanov

241

Lasnv'in cevabını biraz basitleştirdim.

Ayrıca WebDeb'in açıkladığı hatayı düzeltir.

İşte burada:

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
}

İşte oynamak için bir regexer bağlantısı: http://regexr.com/3dnqv


2
sadece bir uyarı: bu sadece bir youtube url'si ile uğraştığınızı bildiğinizde kullanılmalıdır. (Yanlışlıkla) URL'leri youtube olarak doğrulamak için kullandım, bu da yanlış pozitiflere neden oldu, örneğin bu geçer: 'v / 2059-9080-5437'
fabi

3
Şimdi de youtube etki alanı kontrol farklı bir Regex kullanıyorum. Cevabı büyük bir değişiklik olarak güncellemem gerekip gerekmediğinden emin değilim: /^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |. * v =)) ([\ w -] {11}). * /
mantish

4
YouTube ne zaman video kimliği için 12 karaktere geçecek?
Lenar Hoyt

"youtu.be" içindeki nokta kaçmamalıdır?
Alex

haklısın @jitbit Teşekkür ederim. Rağmen genellikle kaçmadan da çalışır.
mantish

85

Bunların hiçbiri 1/1/2015 tarihinden itibaren mutfak lavabosunda, özellikle protokol http / s içermeyen URL'ler ve youtube-nocookie alan adıyla çalışmadı. İşte tüm bu çeşitli Youtube sürümlerinde çalışan değiştirilmiş bir sürüm:

// 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
Yukarıdaki çözümlerin birçoğunun bu geniş geçerli URL grubunu kapsamadığını belirtmekte fayda var, test komut dosyası çok yararlı, +1!
16:56

2
Bu bir sorun olsa olması muhtemel değil ki "www.engadget.com/watch?v=dQw4w9WgXcQ" gibi bir şey aptal olacağını Not
binaryfunt

Çalışıyor, ancak birden fazla youtube url'sine sahip bir metinle ilgili sorunu çözemedi Bu regex101.com/r/qK5qJ5/1 adresine bakın . İkinci URL'yi değiştirmemelidir.
Ashish

3
Boş bir kimliğin eşleşmesini istemiyorsanız : ^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(yani youtube.com/watch?v= eşleşmeyecektir)
zurfyx

"Bunların hiçbiri mutfak lavabosunda çalışmadı" ile ne demek istiyorsun?
rmutalik

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

Test tarihi:

  • 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

Bu diğer cevaptan esinlenildi .


9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). * verecektir grup 1 sonuç
Marc

20

YouTube'un çeşitli URL stilleri olduğu göz önüne alındığında, Regex'in daha iyi bir çözüm olduğunu düşünüyorum. İşte benim Regex:

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

Grup 3'te YouTube Kimliğiniz var

Örnek YouTube URL'leri (şu anda "eski gömme URL stili" dahil) - yukarıdaki Regex hepsinde çalışır:

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 için şapka ucu


9
Gerçekten bununla çizim tahtasına geri dönmeniz gerekiyor. Evet, yukarıdaki URL'lerle doğru bir şekilde eşleşir. Ama aynı zamanda yanlışlıkla gibi diğer birçok sivil youtube-url dizeleri eşleşir: "domain.com/embed/file.txt", "/tv/"ve "Has anyone seen my watch?". Bakınız: çok daha kesin bir çözüm için benzer bir soruya cevabım .
ridgerunner

1
Demek istediğim şu: Yukarıdaki normal ifade "Bu bir YouTube URL'si mi?" ama bu benim amacım değildi. YouTube URL'lerim var - yalnızca bir kimlik alıyorum. Evet, cevabınız sağlam (ve benimkinin kullanmadığı bir kullanım durumunu kapsıyor).
jeffreypriebe

yukarıda bahsettiğim aynı hataya sahip bir 'v' ile başlayan kimlikleri var
webstrap

Teşekkürler @WebDev - YouTube'un kimliğe av koyduğunu (veya "v" ile bir kimlik başlatıp başlatmayacağını) biliyor musunuz?
jeffreypriebe

1
Halen bugün (2013-01-25) çalışıyor. İşte bunun bir örneği: jsfiddle.net/bcmoney/yBP4J
bcmoney

17

Yerleşik medya ile daha sürekli bir tasarım oluşturmak için kullanıcıların Youtube, Soundcloud veya Vimeo gömme kimliklerine yönelik girişlerini test eden bir işlev oluşturdum. Bu işlev iki özelliği olan bir nesneyi algılar ve döndürür: "type" ve "id". Tür "youtube", "vimeo" veya "soundcloud" olabilir ve "id" özelliği benzersiz medya kimliğidir.

Sitede, kullanıcının hem vimeo hem de youtube'un iFrame yerleştirmesi de dahil olmak üzere herhangi bir bağlantı veya gömme koduna yapıştırabileceği bir textarea dökümü kullanıyorum.

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

Güzel fikir, ancak URL biçimlerinin büyük çoğunluğu üzerinde çalışmıyor. Herhangi bir https sitesinde eşleşmeme dahil.
NickG

13

Oyuna geç kaldım, ama mantish ve jw'den iki mükemmel cevap aldım. İlk olarak, değiştirilmiş normal ifade:

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

İşte test kodu (jw'nin daha nazik olanlarına mantişin orijinal test senaryolarını ekledim):

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

Yorumlarda bahsedilen m.youtube URL'lerini işlemek için deneysel sürüm :

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

Bu gerektirir parsed[2]değiştirilecek parsed[3](o ile geçer testlerde iki yerde m.youtubetestlere ilave URL'ler). Sorun görürseniz bana bildirin.


1
Bunu sorunlu olduğu için test elbisenize eklemelisiniz ve regexp'iniz benim için çözdü: youtu.be/ve4f400859I . Harf v önceki regexp
Mark Odey

1
Ben geçerli olarak işaretler http://youtu.be/eklerseniz yanlış postive olsun /. Kullanmak(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d

Yorumlar için teşekkürler. Henüz örneğimi güncellemedim (test etmek için zamanım yok), bu yüzden kodumu kullanan herkes lütfen not al :-)
podperson

url türü = m.youtube.com hakkında ne düşünüyorsun
Mehul Thakkar

@MehulThakkar youtube.com URL'lerine benzer mi?
podperson

11

tl; Dr..

Bu sorudaki tüm URL örnekleriyle ve ardından bazılarıyla eşleşir.

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

Kimlik her zaman maç grubu 7'de olacaktır.

Bu sorunun yanıtlarından aldığım tüm URL'lerin canlı örnekleri: https://regexr.com/3u0d4

Tam açıklama:

Yanıtların / yorumların çoğunun getirdiği gibi, youtube video URL'leri için birçok biçim vardır. Birden fazla TLD bile "barındırılıyor" gibi görünebilir.

Yukarıdaki regexr bağlantısını takip ederek kontrol ettiğim varyasyonların tam listesine bakabilirsiniz.

RegExp'i parçalayalım.

^Dizeyi dizenin başına kilitleyin. (https?:\/\/)?İsteğe bağlı protokoller http: // veya https: // ?Önceki öğeyi isteğe bağlı yapar;s tüm grup (ve bir parantez kümesinde bulunan her şey) isteğe bağlıdır.

Tamam, bu sonraki bölüm et. Temelde iki seçeneğimiz var: www.youtube.com/...[id] 'ün çeşitli sürümleri ve bağlantı youtu.be/[id] sürümü kısaltılmıştır.

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

Sonunda video kimliğini seçecek grubumuz var. Sayı, harf, alt çizgi veya kısa çizgi olan en az bir karakter.

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

Regexr bağlantısına gidip ifadenin her bir kısmının url'deki metinle nasıl eşleştiğini görerek normal ifadenin her bir kısmı hakkında çok daha fazla ayrıntı bulabilirsiniz.


11

Bulduğum en iyi çözüm (2019-2020'den):

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

Burada buldum .

/*
* 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\/)/); eğer (b! == tanımsız) {dönüş b.split (/ [^ 0-9a-z _-] / i) [0]; } başka {dönüş a; }};
Vlad

v = nfDGK_WSFro için başarısız
Deen John

6

YouTube video kimlikleri 11 karakter olarak ayarlandığından substring, URL'yi böldükten hemen sonra yapabiliriz v=. O zaman sonunda ve işareti bağımlı değiliz.

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

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

Güzel ve basit :)


Bu kelimenin tam anlamıyla kabul edilen cevabın kopyası
brasofilo

5

Tüm önerileri özetledim ve işte bu sorunun evrensel ve kısa cevabı:

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

5

Java Kodu: (Tüm URL'ler için çalışır:

  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 için:

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
JavaScript kodundaki Regex kalıbının etrafındaki çift tırnak işaretlerini kaldırın ve çalışması gerekir.
TheDude

4

Biraz daha katı sürüm:

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

Test tarihi:

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

Bir URL'den YouTube video kimliğini almak için aşağıdaki kodu kullanabilirsiniz:

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

Diğer tüm normal örnekleri ile sorunları vardı ama bu etkili bir masaüstü kullanan insanların 3 paylaşım seçenekleri üzerinde çalışır. adres çubuğundan bir url, paylaş düğmesinden bir url ve satır içi paylaş düğmesinden bir url. Teşekkürler!!!
Maarten

2

Yayınlanan bir mantinin biraz değiştirilmiş versiyonu:

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

Bu, kodun her zaman 11 karakter olduğunu varsayar. Bunu ActionScript'te kullanıyorum, {11,11} Javascript'te desteklenip desteklenmediğinden emin değilim. Ayrıca & v = .... için destek eklendi (ne olur ne olmaz)


test ettiğim bir url için çalışan tek URL buydu
Dominic

mükemmel. teşekkürler @Josha 69 bağlantı kombinasyonu i test tüm benim için çalıştı.
gokhan


2

Bir tane daha:

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

Bu başlıkta gösterilen herhangi bir URL ile çalışır.

YouTube 11 base64 karakter içeren başka bir parametre eklediğinde çalışmaz. O zamana kadar bu kolay yol.


2

Aşağıda görülebilen bir Youtube URL'sinden video kimliğini çıkarmak için küçük bir işlev yaptım.

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

Bu işlev, url'de birden çok parametre olsa bile video kimliğini çıkarır.


2

Bu, herhangi bir youtube bağlantı türünden video kimliği alabilir

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

1

Surya'nın cevabını beğendim .. Sadece işe yaramayacağı bir dava ...

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

için çalışmıyor

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

Güncellenmiş versiyon:

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

herkes için çalışır.


1

Bunu dene -

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 cevabının Chris Nolet temizleyici örneği çok iyi, ancak son zamanlarda youtube bağlantınızı metinde bulmaya ve youtube url'sinden sonra bazı rastgele metinler koymaya çalışıyorsanız, regexp'nin gereğinden fazla eşleştiğini öğrendim. Geliştirilmiş Chris Nolet yanıtı:

/^.*(?: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');
    }
}

Test için:

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

Bu karakterlerin "? V =" hiçbir zaman birden fazla görünmeyebileceğini biliyoruz, ancak "v" bir şekilde Kimlik Kendisinde görünebildiğinden sınırlayıcı olarak "? V =" kullanıyoruz. Burada Çalıştığını Görün

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

Tam URL'niz varsa basit regex, basit tutun.

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

umarım yardımcı olabilir


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

En Kısa ve Verimli


doğru değil, başarısız youtube.com/e/dQw4w9WgXcQ vs lütfen verimli kısmı çıkar :)
alecellis1985

0

Webstrap bir belirtildiği gibi comment :

Video "v" ile başlıyorsa ve youtu.be'den geliyorsa işe yaradı

Normal ifade, bunun \??v?=?sadece saat kısmında olması gereken küçük bir hata içeriyor , aksi takdirde 'v'kimlik bir ile başlıyorsa bir filtre uygularsınız 'v'. bu hile yapmalı

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.