2012-03-04 5 views
12

Copie una función que tomará una url de youtube/vimeo y devolverá el sitio del que proviene el video (vimeo/yt), así como también la identificación del video.Regex para extraer el ID de dominio y video de youtube/vimeo url

Esto es lo que tengo hasta ahora: http://jsfiddle.net/csjwf/181/

<strong>Result:</strong> 
<div id="result"></div> 
function parseVideoURL(url) { 

    url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+)).+$/); 
    return { 
     provider : RegExp.$1, 
     id : RegExp.$1 == 'vimeo' ? RegExp.$2 : RegExp.$3 
    } 
} 

var result = document.getElementById("result"); 
var video = parseVideoURL("http://www.youtube.com/watch?v=PQLnmdOthmA&feature=feedrec_grec_index"); 
result.innerHTML = "Provider: " + video.provider + "<br>ID: " + video.id; 

var video = parseVideoURL("http://vimeo.com/22080133"); 

result.innerHTML += "<br>--<br>Provider: " + video.provider + "<br>ID: " + video.id; 

Salida:

Result: 
Provider: youtube 
ID: PQLnmdOthmA 
-- 
Provider: vimeo 
ID: 2208013

Sin embargo, observe la forma de vids vimeo, si la URL termina en la identificación, el el último número siempre está cortado. Si agrega una barra inclinada al final de la url de vimeo, la identificación se extrae por completo.

+1

Voy a dejar [este] (http://gskinner.com/RegExr/) aquí. – Shea

+0

@andrewjackson Prefiero [esto] (http://regex.larsolavtorvik.com/) uno. – Petah

+0

@andrew .. sí, he usado esa herramienta antes, y es definitivamente para alguien que entiende regex ... –

Respuesta

14

El .+$ al final requiere al menos un carácter después del último dígito que se captura como una cadena de dígitos. Eso cortará un dígito de lo que se captura. ¿Hay alguna razón por la que tienes eso allí?

Puede cambiar el último + a un * así:

/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+)).*$/ 

o incluso mejor, deshacerse de la parte final del todo, ya que no parece que se necesita:

/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+))/ 

Aquí hay una forma un poco más segura de escribir su función que permite cualquier orden de los parámetros de consulta en la URL de youtube y no coloca cosas en la expresión regular que no necesita estar allí. El código es más largo, pero es mucho más robusto y sería mucho más fácil añadir más proveedores: versión

function parseVideoURL(url) { 

    function getParm(url, base) { 
     var re = new RegExp("(\\?|&)" + base + "\\=([^&]*)(&|$)"); 
     var matches = url.match(re); 
     if (matches) { 
      return(matches[2]); 
     } else { 
      return(""); 
     } 
    } 

    var retVal = {}; 
    var matches; 

    if (url.indexOf("youtube.com/watch") != -1) { 
     retVal.provider = "youtube"; 
     retVal.id = getParm(url, "v"); 
    } else if (matches = url.match(/vimeo.com\/(\d+)/)) { 
     retVal.provider = "vimeo"; 
     retVal.id = matches[1]; 
    } 
    return(retVal); 
} 

Trabajar aquí: http://jsfiddle.net/jfriend00/N2hPj/

+0

¡La expresión regular más corta gana! ¡Fui con el segundo y funciona genial! ¡Muchas gracias! –

+0

@RyanEllis - FYI, agrego a mi respuesta una versión más robusta de su función que no es sensible al orden de los argumentos de consulta en la cadena de youtube y no permite URLs ilegales que son una mezcla de los formatos vimeo e youtube. – jfriend00

+0

¡Buen trabajo! Acabo de reemplazar mi función anterior con la tuya y parece más rápida (no estoy seguro de qué tan cierto es) Gracias por la función IMPRESIONANTE, y también hace que sea mucho más fácil para otros proveedores de videos. ¿Puedo tenerte en mi bolsillo trasero para todo este proyecto? ;) –

0

último número se corta porque usted está utilizando "+". al final, lo que significa "uno o más de cualquier personaje". Reemplace el + con un *, que significa "cero o más".

+0

Gracias por la respuesta Y la explicación !! –

2

Para simplificar su expresión regular, utilizaría haystack.indexOf (needle) para determinar si la URL es vimeo o youtube y luego aplicaré la expresión regular del sitio. Mucho más fácil, y luego puedes agregar sitios de video sin complicar demasiado la expresión regular.

+0

¡Me gusta! Eso hace las cosas más fáciles para el futuro, ¡gracias! –

+0

contento de ayudar a Buddy :) –

0

url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+).+|(\d+))$/);

0

eliminar el último. y el extremo coincidente

url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+))/);

3

Aquí está una versión actualizada que también trabaja con youtu.be y youtube.com/embed~~V~~singular~~3rd direcciones URL utilizando el código de @ jfriend00 y algo de código que se encuentra aquí: JavaScript REGEX: How do I get the YouTube video id from a URL?.

EDIT: actualicé mi respuesta (y el violín) con una función que realmente funciona. :-)

function parseVideoURL(url) { 

    function getParm(url, base) { 
      var re = new RegExp("(\\?|&)" + base + "\\=([^&]*)(&|$)"); 
      var matches = url.match(re); 
      if (matches) { 
       return(matches[2]); 
      } else { 
       return(""); 
      } 
     } 

     var retVal = {}; 
     var matches; 
     var success = false; 

     if (url.match('http(s)?://(www.)?youtube|youtu\.be')) { 
      if (url.match('embed')) { retVal.id = url.split(/embed\//)[1].split('"')[0]; } 
      else { retVal.id = url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; } 
      retVal.provider = "youtube"; 
      var videoUrl = 'https://www.youtube.com/embed/' + retVal.id + '?rel=0'; 
      success = true; 
     } else if (matches = url.match(/vimeo.com\/(\d+)/)) { 
      retVal.provider = "vimeo"; 
      retVal.id = matches[1]; 
      var videoUrl = 'http://player.vimeo.com/video/' + retVal.id; 
      success = true; 
     } 

     if (success) { 
     return retVal; 
     } 
     else { alert("No valid media id detected"); } 
} 

Y un jsFiddle de trabajo: http://jsfiddle.net/9n8Nn/3/

Fuera de las dos respuestas Stackexchange, este es el código que funcionó mejor para mí en el final.

+0

La ID de youtube no muestra – Carlos

+1

Disculpas por eso. No estoy seguro de qué salió mal, pero he actualizado mi respuesta y el violín. – reblevins

+0

¿Qué pasa si alguien pasa la url como "https://www.youtube.com/watch" se obtiene el error- No se puede leer la propiedad "división" de indefinido – anonymous

Cuestiones relacionadas