Como obtenho o ID do vídeo do YouTube a partir de um URL?


257

Quero obter o v=idURL do YouTube com JavaScript (sem jQuery, JavaScript puro).

Exemplos de formatos de URL do YouTube

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

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

Ou qualquer outro formato do YouTube que contenha um ID de vídeo no URL.

Resultado desses formatos

u8nQa1cJyX8



Essa pergunta é apenas para formatos como o meu segundo. Mas encontrei uma resposta interessante lá, obrigado por compartilhá-la.
Adam

Há uma expressão regular para isso: http://pregcopy.com/exp/27
Exos 15/07/12

Não posso aceitar nenhum crédito por isso, mas achei isso bastante extenso: gist.github.com/FinalAngel/1876898 . Ele ainda captura URLs tão diversos quanto youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGo e youtube.com/v/1p3vcRhsYGo
Simon

2
A partir de 2015: pule para esta resposta . As outras respostas estão desatualizadas.
Lenar Hoyt 13/10/2015

Respostas:


109

Você não precisa usar uma expressão regular para isso.

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

essa é uma função útil para fazê-la funcionar onde você deseja com base nesse código. var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata '; ytid (video_url); função 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); } alerta (video_id); retornar video_id; }
Gino

9
não lida com URLs embutidos
Serge

14
Também não manipula 'share' gerado urls-https://youtu.be/{{video_id}}
hamncheez

2
Esse regex funciona bem com o compartilhamento do YouTube e o URL de exibição. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten

410

Fiz um aprimoramento no Regex fornecido por "jeffreypriebe", porque ele precisava de um tipo de URL do YouTube, que é o URL dos vídeos quando eles estão visualizando através de um canal.

Bem, não, mas esta é a função que eu armei.

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

Estes são os tipos de URLs suportados

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

Pode ser encontrado em [http://web.archive.org/web/20160926134334/] http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube


6
O regex contém um pequeno bug \ ?? v? =? isso deve estar apenas na parte do relógio, caso contrário, você filtraria um 'v' se o ID começar com um 'v'. então isso deve funcionar /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
webstrap

69
Ainda mais limpo: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ use em match[1]vez de match[7](o que me pareceu um pouco arbitrário). Também corrige o erro apontado pelo WebDev.
22612 Chris Nolet

3
Quanto tempo até os IDs do YouTube terem 12 caracteres?
Lenar Hoyt 13/10/2015

1
Você sabia que ele não está realmente perfeito, se você colocar anything.com/watch?v=jn40gqhxoSY Ele acha que é uma url youtube
Gino

1
Qualquer um pode estender esse reqex e, portanto, as pessoas reclamando não fazem nenhum sentido.
Lecha Bisultanov 07/12/19

241

Simplifiquei um pouco a resposta de Lasnv.

Também corrige o bug descrito pelo WebDeb.

Aqui está:

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
}

Aqui está um link regexer para jogar: http://regexr.com/3dnqv


2
apenas um aviso: isso só deve ser usado quando você sabe que está lidando com um URL do YouTube. I (indevidamente) é usado para verificar URLs como youtube, o que causou falsos positivos, por exemplo, este passa: 'v / 2059-9080-5437'
fabi

3
Estou usando agora um Regex diferente que também verifica um domínio do youtube. Não tenho certeza se devo atualizar a resposta, pois é uma grande mudança: /^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |. * v =)) ([\ w -] {11}). * /
mantish

4
Quando o YouTube mudará para 12 caracteres para o ID do vídeo?
Lenar Hoyt 13/10/2015

o ponto em "youtu.be" não deveria ser escapado?
Alex #

você está certo @jitbit Obrigado. Embora geralmente funcione bem sem escapar.
mantish

85

Nenhum deles funcionou na pia da cozinha a partir de 1/1/2015, principalmente URLs sem http / se protocal e com domínio youtube-nocookie. Então, aqui está uma versão modificada que funciona em todas essas várias versões do 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
Vale ressaltar que muitas das soluções acima não cobrem esse amplo lote de URLs válidos, o script de teste é muito útil, +1!
blended

2
Note-se que esta será enganado por algo como "www.engadget.com/watch?v=dQw4w9WgXcQ", não que isso é provável que seja um problema embora
binaryfunt

Funciona, mas não foi possível corrigir o problema decorrente de um texto com vários URLs do youtube. Veja este regex101.com/r/qK5qJ5/1 . Não deve substituir o segundo URL.
Ashish

2
Se você não quer que um vazio partidas ID : ^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(ie youtube.com/watch?v= não irá corresponder)
zurfyx

O que você quer dizer com "Nada disso funcionou na pia da cozinha"?
rmutalik

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

Testado em:

  • http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=pt_BR&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

Inspirado por essa outra resposta .


9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). * dará você o resultado no grupo 1
Marc

20

Dado que o YouTube tem uma variedade de estilos de URL, acho que o Regex é uma solução melhor. Aqui está o meu Regex:

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

O grupo 3 tem seu ID do YouTube

Exemplos de URLs do YouTube (atualmente, incluindo "estilo de URL incorporado herdado") - o Regex acima funciona em todos eles:

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

Gorjeta de chapéu para Lasnv


9
Você realmente precisa voltar para a prancheta com esta. Sim, ele corresponde aos URLs acima corretamente. Mas também corresponde erroneamente muitas outras cordas não-youtube-url, tais como: "domain.com/embed/file.txt", "/tv/"e "Has anyone seen my watch?". Veja: minha resposta a uma pergunta semelhante para uma solução muito mais precisa.
precisa saber é o seguinte

1
Entendo o seu argumento: a regex acima é inútil para responder à pergunta "Este é um URL do YouTube?" mas esse não era meu objetivo. Eu tenho URLs do YouTube - estou apenas extraindo um ID. Sim, sua resposta é sólida (e abrange um caso de uso que o meu não).
51111 jeffreypriebe

você tem o mesmo bug que eu mencionei acima com os IDs começando com um 'v'
webstrap

Obrigado @WebDev - você sabe se o YouTube coloca um av no ID (ou inicia um ID com um "v")?
jeffreypriebe

1
Ainda funciona a partir de hoje (25/01/2013). Aqui está um exemplo disso em ação: jsfiddle.net/bcmoney/yBP4J
bcmoney

17

Criei uma função que testa as entradas de usuários para o YouTube, o Soundcloud ou o Vimeo incorporam IDs, para poder criar um design mais contínuo com a mídia incorporada. Esta função detecta e retorna um objeto com duas propriedades: "type" e "id". O tipo pode ser "youtube", "vimeo" ou "soundcloud" e a propriedade "id" é o ID de mídia exclusivo.

No site, uso um despejo de área de texto, onde o usuário pode colar qualquer tipo de link ou código de incorporação, incluindo a incorporação por iFrame do vimeo e do 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;
}

Boa ideia, mas não funciona na grande maioria dos formatos de URL. Incluindo a não correspondência em sites https.
25917 NickG

13

Tarde para o jogo aqui, mas juntei duas excelentes respostas de mantish e jw. Primeiro, o regex modificado:

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

Aqui está o código de teste (eu adicionei os casos de teste originais do mantish aos mais desagradáveis ​​do 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');
  }

Versão experimental para lidar com os URLs do m.youtube mencionados nos comentários:

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

Ele precisa parsed[2]ser alterado para parsed[3]em dois locais nos testes (que passam com os m.youtubeURLs adicionados aos testes). Deixe-me saber se você encontrar problemas.


1
Você deve adicionar este no seu traje de teste, pois era problemático e seu regexp o resolveu para mim: youtu.be/ve4f400859I . A letra v foi arrancada no meu regexp anterior
Mark Odey

1
Eu recebo postive falso, http://youtu.be/se eu adicionar o /que marca como válido. Utilizando-o em(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d 5/09/18

Obrigado pelos comentários. Eu não atualizei meu exemplo ainda (não têm tempo para teste) para que qualquer pessoa usando o meu código por favor, tome nota :-)
podperson

que tal url do tipo = m.youtube.com
Mehul Thakkar

@MehulThakkar são semelhantes aos URLs do youtube.com?
precisa saber é

11

tl; dr.

Corresponde a todos os exemplos de URL nesta questão e mais alguns.

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

O ID estará sempre no grupo de correspondência 7.

Exemplos ao vivo de todos os URLs que peguei nas respostas a esta pergunta: https://regexr.com/3u0d4

Explicação completa:

Como muitas respostas / comentários surgiram, existem muitos formatos para URLs de vídeo do youtube. Até vários TLDs em que eles podem parecer "hospedados".

Você pode ver a lista completa de variações contra as quais eu verifiquei, seguindo o link regexr acima.

Vamos quebrar o RegExp.

^Bloqueie a string no início da string. (https?:\/\/)?Protocolos opcionais http: // ou https: // ?Torna o item anterior opcional para que stodo o grupo (qualquer coisa entre parênteses) entre parênteses seja opcional.

Ok, esta próxima parte é a carne disso. Basicamente, temos duas opções, as várias versões do www.youtube.com/...[id] e o link abreviado 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

Finalmente, temos o grupo para selecionar o ID do vídeo. Pelo menos um caractere que é um número, letra, sublinhado ou traço.

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

Você pode descobrir muito mais detalhes sobre cada parte da regex, encabeçando o link regexr e vendo como cada parte da expressão corresponde ao texto no URL.


10

A melhor solução (de 2019-2020) que encontrei é a seguinte:

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

Encontrei aqui .

/*
* 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! == indefinido) {return b.split (/ [^ 0-9a-z _-] / i) [0]; } else {retornar a; }};
Vlad

Falha para v = nfDGK_WSFro
Deen John

6

Como os IDs de vídeo do YouTube estão definidos para 11 caracteres , podemos simplesmente logo substringapós dividirmos o URL v=. Então não somos dependentes do e comercial no final.

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

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

Agradável e simples :)


Este é literalmente um duplicado da resposta aceita
brasofilo

5

Resumi todas as sugestões e aqui está a resposta universal e curta a esta pergunta:

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

5

Código Java: (Funciona para todos os URLs:

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

    }

Para 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
Remova as aspas duplas ao redor do padrão Regex no código JavaScript e deve funcionar.
TheDude 27/05

4

Versão ligeiramente mais rigorosa:

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

Testado em:

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

Você pode usar o código a seguir para obter o ID do vídeo do YouTube a partir de um 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]);

Eu tive problemas com todos os outros exemplos de regex, mas este funciona efetivamente nas 3 opções de compartilhamento que as pessoas nos desktops usam. um URL da barra de endereço, um URL do botão de compartilhamento e um URL do botão de compartilhamento embutido. Obrigado!!!
Maarten

2

Uma versão ligeiramente alterada da mantish postada:

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

Isso pressupõe que o código tenha sempre 11 caracteres. Estou usando isso no ActionScript, não tenho certeza se {11,11} é suportado em Javascript. Também foi adicionado suporte para & v = .... (apenas no caso)


esse foi o único que funcionou para um URL que eu estava testando: youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
Dominic

perfeito. obrigado @Josha 69 combinação de links eu testei tudo foi trabalhado para mim.
Gokhan

2

Definitivamente, isso requer regex:

Copie para 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]

Consulte para todos os casos de teste: https://gist.github.com/blairanderson/b264a15a8faaac9c6318


2

Mais um:

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

Funciona com qualquer URL mostrado neste tópico.

Não funcionará quando o YouTube adicionar outro parâmetro com 11 caracteres base64. Até então, é o caminho mais fácil.


2

Eu criei uma pequena função para extrair o ID do vídeo de um URL do Youtube, que pode ser visto abaixo.

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

Essa função extrairá o ID do vídeo, mesmo que haja vários parâmetros no URL.


2

Isso pode obter o ID do vídeo a partir de qualquer tipo de link do 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

Gostei da resposta da Surya .. Apenas um caso em que não vai funcionar ...

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

não funciona para

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

versão atualizada:

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

funciona para todos.


1

Tente este -

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

O exemplo mais limpo de Chris Nolet da resposta Lasnv é muito bom, mas recentemente descobri que se você está tentando encontrar o link do youtube no texto e colocar algum texto aleatório após o URL do youtube, o regexp corresponde muito mais do que o necessário. Resposta melhorada de Chris Nolet:

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

Para teste:

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

Bem, a maneira de fazer isso com a análise simples seria: começar tudo depois do primeiro sinal = para o primeiro & sinal.

Eu acho que eles tiveram uma resposta semelhante aqui:

Analisando um ID do Vimeo usando JavaScript?


2
E se o URL não contiver &?
Adam

Então você deve encontrar qual é o delimitador equivalente. Por exemplo, o primeiro URL que você nos deu é o sinal &. No segundo URL, o final da sequência é o delimitador.
karlphillip

0

Sabemos que esses caracteres "? V =" nunca podem aparecer mais que um, mas 'v' pode aparecer de alguma forma no próprio Id, então usamos "? V =" como delimitador. Veja trabalhando aqui

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

Regex simples, se você tiver o URL completo, mantenha-o simples.

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

espero que possa ajudar


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

Menor e eficiente


não é certo, não vs youtube.com/e/dQw4w9WgXcQ então por favor tire a parte eficiente :)
alecellis1985

0

Como webstrap mencionado em um comentário :

Funcionou se o vídeo começar com "v" e for de youtu.be

O regex contém um pequeno bug, que \??v?=?deve estar apenas na parte do relógio, caso contrário, você filtraria a 'v'se o id começar com a 'v'. então isso deve fazer o truque

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.