Vylepšení regulárního výrazu pro analýzu adres URL YouTube / Vimeo

Vytvořil jsem funkci (v JavaScriptu), která bere adresu URL z YouTube nebo Vimeo. Zjistí poskytovatele a ID pro toto konkrétní video (demo:http://jsfiddle.net/csjwf/).

function parseVideoURL(url) {

    var provider = url.match(/http://(:?www.)?(w*)/)[2],
        id;

    if(provider == "youtube") {

        id = url.match(/http://(?:www.)?(w*).com/.*v=(w*)/)[2];
    } else if (provider == "vimeo") {

        id = url.match(/http://(?:www.)?(w*).com/(d*)/)[2];
    } else {
        throw new Error("parseVideoURL() takes a YouTube or Vimeo URL");    
    }
    return {
        provider : provider,
        id : id
    }
}

Funguje to, ale jako regex nováček hledám způsoby, jak to zlepšit. Vstup, kterým se zabývám, obvykle vypadá takto:

http://vimeo.com/(id)
http://youtube.com/watch?v=(id)&blahblahblah.....

1) Právě teď dělám tři samostatné zápasy, mělo by smysl zkusit a udělat vše v jednom jediném výrazu? Pokud ano, jak?

2) Mohly by být stávající zápasy stručnější? Jsou zbytečně složité? nebo možná nedostatečné?

3) Existují nějaké adresy URL YouTube nebo Vimeo, které by se nepodařilo analyzovat? Vyzkoušel jsem jich docela dost a zatím se zdá, že to funguje docela dobře.

Shrnutí: Jednoduše hledám způsoby, jak zlepšit výše uvedenou funkci. Velmi si vážíme každé rady.

Odpověď

Nejsem si jistý vaší otázkou 3), ale za předpokladu, že je vaše indukce na formulářích url správná, lze regulární výrazy sloučit do jednoho následovně:

/http://(?:www.)?(?:(vimeo).com/(.*)|(youtube).com/watch?v=(.*?)&)/

Zápas dostanete pod různými pozicemi (1. a 2. zápas, pokud vimeo, 3. a 4. zápas, pokud youtube), takže to prostě musíte zvládnout.

Nebo, pokud jste si zcela jisti, že id vimea obsahuje pouze čísla, můžete:

/http://(?:www.)?(vimeo|youtube).com/(?:watch?v=)?(.*?)(?:z|&)/

a poskytovatel a id se zobrazí pod 1. a 2. shodou.