2012-03-04 13 views
12

Sto copiando una funzione che prenderà un URL youtube/vimeo e restituirà da quale sito proviene il video (vimeo/yt) e l'id del video.Regex per estrarre il dominio e l'id video da youtube/vimeo url

Ecco quello che ho finora: 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; 

uscita:

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

Tuttavia, notare come per vids Vimeo, se l'URL termina con l'ID, la l'ultimo numero è sempre interrotto. Se aggiungi una barra alla fine dell'URL vimeo, l'ID viene estratto completamente.

+1

Lascerò qui [questo] (http://gskinner.com/RegExr/) qui. – Shea

+0

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

+0

@andrew .. sì, ho usato quello strumento prima, ed è def per qualcuno che capisce regex .. –

risposta

14

Il numero .+$ alla fine richiede almeno un carattere dopo l'ultima cifra catturata come stringa di cifre. Ciò taglierà una cifra da ciò che viene catturato. C'è una ragione per cui tu ci sia?

È possibile modificare l'ultima + ad un * come questo:

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

o, meglio ancora, di sbarazzarsi della parte terminale del tutto dal momento che non sembra ce n'è bisogno:

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

Ecco un modo un po 'più sicuro per scrivere la tua funzione che consente qualsiasi ordine dei parametri di query nell'URL di YouTube e non inserisce elementi nella regex che non devono necessariamente essere presenti. Il codice è più lungo, ma è molto più robusto e sarebbe molto più facile per aggiungere più fornitori: versione

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

Lavorare qui: "+" http://jsfiddle.net/jfriend00/N2hPj/

+0

Vince la regex più breve! Sono andato con il 2 ° e funziona benissimo! Grazie mille! –

+0

@RyanEllis - FYI, aggiungo alla mia risposta una versione più robusta della tua funzione che non è sensibile all'ordine degli argomenti della query nella stringa youtube e non consente URL illegali che sono un mix dei formati vimeo e youtube. – jfriend00

+0

Bel lavoro! Ho appena sostituito la mia vecchia funzione con la tua e sembra più veloce (non sono sicuro di quanto sia vero) Grazie per la funzione AWESOME, e rende molto più semplice anche per altri fornitori di video !! Posso tenerti nella mia tasca posteriore per questo intero progetto? ;) –

0

ultimo numero viene tagliato fuori perché si sta utilizzando alla fine, che significa "uno o più personaggi". Sostituisci il + con un *, che significa "zero o più".

+0

Grazie per la risposta E la spiegazione !! –

2

Per semplificare l'espressione regolare, utilizzerei haystack.indexOf (ago) per determinare se l'url è vimeo o youtube e quindi applicare espressioni regolari specifiche del sito. Molto più facile, e in seguito è possibile aggiungere siti di video senza complicare eccessivamente la regex.

+0

Mi piace! Ciò rende le cose più facili per il futuro, grazie! –

+0

felice di aiutare amico :) –

0

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

0

rimuovere l'ultimo. e la fine abbinando

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

3

Qui è una versione aggiornata che funziona anche con youtu.be e youtube.com/embed~~V~~singular~~3rd URL utilizzando il codice @ di jfriend00 e alcuni codice trovato qui: JavaScript REGEX: How do I get the YouTube video id from a URL?.

MODIFICA: aggiornata la mia risposta (e il violino) con una funzione che funziona effettivamente. :-)

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

E un jsfiddle di lavoro: http://jsfiddle.net/9n8Nn/3/

Dei due risposte StackExchange, questo è il codice che ha funzionato meglio per me alla fine.

+0

L'ID di YouTube non mostra – Carlos

+1

Scuse per quello. Non sono sicuro di cosa sia andato storto, ma ho aggiornato la mia risposta e il violino. – reblevins

+0

cosa succede se qualcuno passa l'url come "https://www.youtube.com/watch" si ottiene l'errore- Impossibile leggere la proprietà 'split' di indefinito – anonymous

Problemi correlati