¿Cómo obtengo el ID de video de YouTube de una URL?

257

Quiero obtener la v=idURL de YouTube con JavaScript (sin jQuery, JavaScript puro).

Ejemplos de formatos de URL de YouTube

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

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

O cualquier otro formato de YouTube que contenga una ID de video en la URL.

Resultado de estos formatos

u8nQa1cJyX8

Adán
fuente
Esa pregunta es solo para formatos como el segundo. Pero encontré una respuesta interesante allí, gracias por compartirla.
Adam
Hay una expresión regular para eso: http://pregcopy.com/exp/27
Exos
No puedo dar crédito por ello, pero me pareció bastante extenso: gist.github.com/FinalAngel/1876898 . Incluso captura URL tan diversas como youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGo y youtube.com/v/1p3vcRhsYGo
Simon
2
A partir de 2015: pase a esta respuesta . Las otras respuestas están desactualizadas.
Lenar Hoyt

Respuestas:

109

No necesita usar una expresión regular para esto.

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
fuente
Esta es una función útil para que funcione donde lo desee según este código. var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata '; ytid (video_url); función 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); volver video_id; }
Gino
99
no maneja URL incrustadas
Serge
14
tampoco maneja las URL generadas "compartir"https://youtu.be/{{video_id}}
hamncheez
2
Esta expresión regular funciona bien con youtube share and watch url. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten
410

Realicé una mejora en Regex proporcionada por "jeffreypriebe" porque necesitaba una especie de URL de YouTube que es la URL de los videos cuando están mirando a través de un canal.

Bueno no, pero esta es la función que he armado.

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

Estos son los tipos de URL compatibles

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

Se puede encontrar en [http://web.archive.org/web/20160926134334/] http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube

Lasnv
fuente
66
La expresión regular contiene un pequeño error \ ?? v? =? esto debería estar en la parte del reloj, de lo contrario, filtraría una 'v' si la identificación comienza con una 'v'. así que esto debería hacer el truco /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
webstrap
69
Incluso más limpio: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ luego use en match[1]lugar de match[7](que me pareció un poco arbitrario). También corrige el error señalado por WebDev.
Chris Nolet
3
¿Cuánto tiempo hasta que los ID de YouTube tengan 12 caracteres?
Lenar Hoyt
1
¿Sabías que no es realmente perfecto, si pones algo.com/watch?v=jn40gqhxoSY? Creo que es una url de YouTube
Gino
1
Cualquiera puede extender este requisito y, por lo tanto, las personas que se quejan no tienen ningún sentido.
Lecha Bisultanov
241

Simplifiqué un poco la respuesta de Lasnv.

También corrige el error que describe WebDeb.

Aquí 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
}

Aquí hay un enlace regexer para jugar: http://regexr.com/3dnqv

mantish
fuente
2
solo un aviso: esto solo debe usarse cuando sabes que estás tratando con una url de youtube. Lo (erróneamente) lo usé para verificar las URL como youtube, lo que causó falsos positivos, por ejemplo, esto pasa: 'v / 2059-9080-5437'
fabi
3
Estoy usando ahora un Regex diferente que también busca un dominio de youtube. No estoy seguro de si debo actualizar la respuesta, ya que es un gran cambio: /^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |. * v =)) ([\ w -] {11}). * /
mantish
44
¿Cuándo cambiará YouTube a 12 caracteres para la identificación del video?
Lenar Hoyt
¿No debería escapar el punto en "youtu.be"?
Alex
tienes razón @jitbit Gracias. Aunque generalmente funciona tan bien sin escapar.
Mantish
85

Ninguno de estos funcionó en el fregadero de la cocina a partir del 1/1/2015, especialmente las URL sin http / s protocal y con el dominio youtube-nocookie. Así que aquí hay una versión modificada que funciona en todas estas versiones de Youtube:

// Just the regex. Output is in [1].
/^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/

// For testing.
var urls = [
    '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
    'http://youtu.be/6dwqZw0j_jY',
    'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
    'http://youtu.be/afa-5HQHiAs',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
    'http://www.youtube.com/watch?v=peFZbP64dsU',
    'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
];

var i, r, rx = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/;

for (i = 0; i < urls.length; ++i) {
    r = urls[i].match(rx);
    console.log(r[1]);
}
JW
fuente
2
Vale la pena señalar que muchas de las soluciones anteriores no cubren este amplio lote de URL válidas, ¡el script de prueba es muy útil, +1!
sangrado
2
Tenga en cuenta que esto va a ser engañado por algo así como "www.engadget.com/watch?v=dQw4w9WgXcQ", no es que sea probable que sea un problema sin embargo
binaryfunt
Funciona, pero no se pudo solucionar el problema que surge de un texto con varias URL de YouTube . Consulte este regex101.com/r/qK5qJ5/1 . No debe reemplazar la segunda url.
Ashish
2
Si no desea que coincida una ID vacía : ^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(es decir, youtube.com/watch?v= no coincidirá)
zurfyx
¿Qué quieres decir con "Ninguno de estos funcionó en el fregadero de la cocina"?
rmutalik
26
/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/

Probado en:

  • 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

Inspirado por esta otra respuesta .

xronosiam
fuente
99
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). * dará usted el resultado en el grupo 1
Marc
20

Dado que YouTube tiene una variedad de estilos de URL, creo que Regex es una mejor solución. Aquí está mi expresión regular:

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

El grupo 3 tiene su ID de YouTube

Ejemplos de URL de YouTube (actualmente, incluido el "estilo de URL de inserción heredado"): el Regex anterior funciona en todos ellos:

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

Punta de sombrero para Lasnv

jeffreypriebe
fuente
99
Realmente necesitas volver al tablero de dibujo con este. Sí, coincide con las URL anteriores correctamente. Pero también coincide erróneamente muchas otras cadenas no youtube-url como: "domain.com/embed/file.txt", "/tv/"y "Has anyone seen my watch?". Ver: mi respuesta a una pregunta similar para una solución mucho más precisa.
ridgerunner
1
Veo su punto: la expresión regular anterior es inútil para responder la pregunta de "¿Es esta una URL de YouTube?" Pero ese no era mi objetivo. Tengo URL de YouTube: simplemente estoy extrayendo una identificación. Sí, su respuesta es sólida (y cubre un caso de uso que el mío no).
jeffreypriebe 05 de
tienes el mismo error que mencioné anteriormente con identificadores que comienzan con una 'v'
webstrap
Gracias @WebDev, ¿sabes si YouTube alguna vez pone av en la ID (o comienza una ID con una "v")?
jeffreypriebe
1
Todavía funciona a partir de hoy (2013-01-25). Aquí hay un ejemplo de ello en acción: jsfiddle.net/bcmoney/yBP4J
bcmoney el
17

Creé una función que prueba la entrada de un usuario para Youtube, Soundcloud o Vimeo, para poder crear un diseño más continuo con medios integrados. Esta función detecta y devuelve un objeto con dos propiedades: "tipo" e "id". El tipo puede ser "youtube", "vimeo" o "soundcloud" y la propiedad "id" es la identificación de medios única.

En el sitio utilizo un volcado de área de texto, donde el usuario puede pegar cualquier tipo de enlace o código de incrustación, incluida la incrustación de iFrame de vimeo y 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
fuente
Buena idea, pero no funciona en la gran mayoría de los formatos de URL. Incluyendo no coincidir en ningún sitio https.
NickG
13

Tarde al juego aquí, pero he combinado dos excelentes respuestas de mantish y jw. Primero, la expresión regular modificada:

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

Aquí está el código de prueba (he agregado los casos de prueba originales de mantish a los más desagradables de 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');
  }

Versión experimental para manejar las URL de m.youtube mencionadas en los comentarios:

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

Requiere parsed[2]ser cambiado a parsed[3]dos lugares en las pruebas (que luego pasa con las m.youtubeURL agregadas a las pruebas). Avísame si ves problemas.

podperson
fuente
1
Debe agregar este en su traje de prueba ya que era problemático y su expresión regular lo resolvió por mí: youtu.be/ve4f400859I . La letra v fue eliminada en mi expresión anterior
Mark Odey
1
Obtengo falso positivo porque http://youtu.be/si agrego el, /lo marca como válido. Su uso en(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d
Gracias por los comentarios. Todavía no he actualizado mi ejemplo (no tengo tiempo para probar), así que cualquiera que use mi código, tenga en cuenta :-)
podperson
¿qué pasa con url de tipo = m.youtube.com
Mehul Thakkar
@MehulThakkar ¿son similares a las URL de youtube.com?
podperson
11

tl; dr.

Coincide con todos los ejemplos de URL en esta pregunta y más.

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

La identificación siempre estará en el grupo 7 del partido.

Ejemplos en vivo de todas las URL que obtuve de las respuestas a esta pregunta: https://regexr.com/3u0d4

Explicación completa:

Como han aparecido muchas respuestas / comentarios, hay muchos formatos para las URL de video de youtube. Incluso múltiples TLD donde pueden parecer "alojados".

Puede consultar la lista completa de variaciones que verifiqué siguiendo el enlace regexr anterior.

Vamos a romper el RegExp.

^Bloquee la cadena al inicio de la cadena. (https?:\/\/)?Protocolos opcionales http: // o https: // Esto ?hace que el elemento anterior sea opcional, por lo que el sy luego todo el grupo (todo lo que se incluye entre paréntesis) son opcionales.

Ok, la siguiente parte es la carne de esto. Básicamente tenemos dos opciones, las diversas versiones de www.youtube.com/...[id] y el enlace acortó la versión 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 tenemos el grupo para seleccionar la ID del video. Al menos un carácter que es un número, letra, guión bajo o guión.

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

Puede encontrar muchos más detalles sobre cada parte de la expresión regular dirigiéndose al enlace regexr y ver cómo cada parte de la expresión coincide con el texto en la url.

tsdorsey
fuente
10

La mejor solución (de 2019-2020) que encontré es que:

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

Lo encontré aquí .

/*
* 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
fuente
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; }};
Vlad
falla para v = nfDGK_WSFro
Deen John
6

Dado que los identificadores de video de YouTube tienen 11 caracteres , podemos simplemente substringdividir la URL con v=. Entonces no somos dependientes del ampersand al final.

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

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

Agradable y simple :)

marca
fuente
Esta es literalmente un duplicado de la respuesta aceptada
brasofilo
5

He resumido todas las sugerencias y aquí está la respuesta universal y breve a esta pregunta:

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

Código Java: (Funciona para todas las 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));

    }

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

    }
surya
fuente
1
Elimine las comillas dobles alrededor del patrón Regex en el código JavaScript y debería funcionar.
TheDude
4

Versión ligeramente más estricta:

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

Probado en:

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

Puede usar el siguiente código para obtener la identificación de video de YouTube desde una 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
fuente
Tuve problemas con todos los otros ejemplos de expresiones regulares, pero este funciona efectivamente en las 3 opciones de uso compartido que usan las personas en los escritorios. una url de la barra de direcciones, una url del botón compartir y una url del botón compartir en línea. ¡¡¡Gracias!!!
Maarten
2

Una versión ligeramente modificada del mantish publicado:

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

Esto supone que el código siempre tiene 11 caracteres. Estoy usando esto en ActionScript, no estoy seguro si {11,11} es compatible con Javascript. También se agregó soporte para & v = .... (por si acaso)

Josha
fuente
este fue el único que funcionó para una url que estaba probando con: youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
Dominic
Perfecto. gracias @Josha 69 combinación de enlaces que pruebo todo funcionó para mí.
Gokhan
2

Esto definitivamente requiere regex:

Copiar en 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 todos los casos de prueba: https://gist.github.com/blairanderson/b264a15a8faaac9c6318

Blair Anderson
fuente
2

Uno mas:

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

Funciona con cualquier URL mostrada en este hilo.

No funcionará cuando YouTube agregue algún otro parámetro con 11 caracteres base64. Hasta entonces es el camino fácil.

pykiss
fuente
2

Hice una pequeña función para extraer la identificación del video de una url de Youtube que se puede ver a continuación.

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

Esta función extraerá la identificación del video incluso si hay múltiples parámetros en la url.

Jake
fuente
2

Esto puede obtener la identificación de video de cualquier tipo de enlaces de 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
fuente
1

Me gustó la respuesta de Surya ... Solo un caso en el que no funcionará ...

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

no funciona para

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

Versión actualizada:

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

Funciona para todos.

usuario2200660
fuente
1

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

El ejemplo más limpio de Chris Nolet de la respuesta de Lasnv es muy bueno, pero recientemente descubrí que si intentas encontrar tu enlace de youtube en el texto y poner un texto aleatorio después de la url de youtube, regexp coincide mucho más de lo necesario. Respuesta mejorada de Chris Nolet:

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

mindaug
fuente
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 las pruebas:

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

Bueno, la forma de hacerlo con un análisis simple sería: comenzar todo después del primero = señal para el primer y señal.

Creo que tenían una respuesta similar aquí:

¿Analizando una ID de Vimeo usando JavaScript?

karlphillip
fuente
2
¿Y si la URL no contiene &?
Adam
Entonces debes encontrar cuál es el delimitador equivalente. Por ejemplo, la primera URL que nos dio es el signo &. En la segunda URL, el final de la cadena es el delimitador.
karlphillip
0

Sabemos que estos caracteres "? V =" nunca pueden aparecer más que unos, pero 'v' puede aparecer de alguna manera en el Id mismo, así que usamos "? V =" como delimitador. Véalo trabajando aquí

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

Regex simple si tiene la URL completa, manténgala simple.

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

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

Más corto y eficiente

Wasim A.
fuente
no está bien, falla vs youtube.com/e/dQw4w9WgXcQ, así que saque la parte eficiente :)
alecellis1985
0

Como la correa web mencionada en un comentario :

Funcionó si el video comienza con "v" y es de youtu.be

La expresión regular contiene un pequeño error que \??v?=?debería estar en la parte de vigilancia, de lo contrario, filtraría un 'v'si la identificación comienza con un 'v'. así que esto debería hacer el truco

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

Shuher
fuente