2012-03-04 10 views
12

Kopiuję funkcję, która pobiera adres URL youtube/vimeo i zwraca stronę z której wideo pochodzi (vimeo/yt), a także identyfikator wideo.Regex do wyodrębniania domeny i identyfikatora wideo z adresu URL youtube/vimeo

Oto co mam do tej pory: 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; 

wyjściowa:

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

jednak zauważyć, jak na Vimeo vids, jeśli adres URL kończy się w identyfikator, ostatnia liczba jest zawsze odcięta. Jeśli dodasz ukośnik na końcu adresu vimeo, identyfikator zostanie wciągnięty do końca.

+1

Zostawię to [tutaj] (http://gskinner.com/RegExr/) tutaj. – Shea

+0

@andrewjackson Wolę ten (http://regex.larsolavtorvik.com/) jeden. – Petah

+0

@andrew .. Tak, użyłem tego narzędzia wcześniej, a to jest dla kogoś, kto rozumie regex .. –

Odpowiedz

14

Na końcu wymagany jest co najmniej jeden znak po ostatniej cyfrze przechwyconej jako ciąg cyfr. To odetnie jedną cyfrę od tego, co zostało przechwycone. Czy jest jakiś powód, dla którego to masz?

Można zmienić ostatni + do * jak ten:

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

lub nawet lepiej, pozbyć się części końcowej w całości, ponieważ nie wygląda jak jest to potrzebne:

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

Oto nieco bezpieczniejszy sposób napisania funkcji, która pozwala na dowolną kolejność parametrów zapytania w adresie URL youtube i nie umieszcza rzeczy w regexie, który nie musi tam być. Kod jest dłuższa, ale znacznie bardziej wytrzymałe i byłoby o wiele łatwiejsze, aby dodać więcej dostawców: Wersja

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

pracy tutaj: „+” http://jsfiddle.net/jfriend00/N2hPj/

+0

Krótsze wyrażenie wygrywa! Poszedłem z drugim i działa świetnie! Dzięki wielkie! –

+0

@RyanEllis - FYI, dodam do mojej odpowiedzi bardziej rozbudowaną wersję twojej funkcji, która nie jest wrażliwa na kolejność argumentów zapytania w ciągu youtube i nie zezwala na nielegalne adresy URL, które są mieszanką formatów vimeo i youtube. – jfriend00

+0

Dobra robota! Właśnie zamieniłem swoją poprzednią funkcję na twoją i wydaje się, że jest szybsza (nie jestem pewna, jak jest prawdziwa). Dzięki za funkcję AWESOME, która znacznie ułatwia innym dostawcom wideo !! Czy mogę zatrzymać cię w tylnej kieszeni na cały projekt? ;) –

0

Ostatni numer zostanie odcięty, ponieważ używasz na końcu, co oznacza "jedną lub więcej dowolnych postaci". Zastąp symbol + znakiem *, oznaczającym "zero lub więcej".

+0

Dzięki za odpowiedź I wyjaśnienie !! –

2

Aby uprościć regex użyłbym haystack.indexOf (igły) w celu określenia, czy adres URL jest Vimeo czy YouTube, a następnie zastosować miejscowo specyficzne wyrażenia regularnego. O wiele łatwiej, a później można dodawać witryny wideo bez nadmiernego komplikowania wyrażenia regularnego.

+0

Podoba mi się! To ułatwia przyszłość, dzięki! –

+0

Cieszę się, że mogę pomóc kumplowi :) –

0

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

0

Usuń ostatni. a koniec dopasowanie

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

3

Oto uaktualniona wersja, która również pracuje z youtu.be i youtube.com/embed adresów URL za pomocą kodu @ jfriend00 i trochę kodu znaleźć tutaj: JavaScript REGEX: How do I get the YouTube video id from a URL?.

EDYCJA: Zaktualizowałem moją odpowiedź (i skrzypce) funkcją, która faktycznie działa. :-)

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

a jsfiddle robocza: http://jsfiddle.net/9n8Nn/3/

z dwóch odpowiedzi Stack Exchange Network, jest to kod, który pracował dla mnie najlepsza w końcu.

+0

Identyfikator youtube nie pokazuje – Carlos

+1

Przeprosin za to. Nie jestem pewien, co poszło nie tak, ale zaktualizowałem moją odpowiedź i skrzypce. – reblevins

+0

co, jeśli ktoś poda adres URL, np. "Https://www.youtube.com/watch" , pojawi się błąd - Nie można odczytać właściwości "podzielenie" niezdefiniowanej – anonymous

Powiązane problemy