2012-03-04 33 views
12

youtube/vimeo URLを取得し、ビデオID(vimeo/yt)とビデオIDを取得する関数をコピーします。YouTube/vimeo URLからドメインとビデオIDを抽出するRegex

ここで私がこれまで持っているものだ:、URLはIDに終了した場合、Vimeoの分割動画のためにどのように気づく、しかし

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

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; 

出力を最後の番号は常に切り捨てられます。 vimeo URLの最後にスラッシュを追加すると、IDは完全に引き出されます。

+1

ここに[this](http://gskinner.com/RegExr/)を残しておきます。 – Shea

+0

@andrewjackson私は[this](http://regex.larsolavtorvik.com/)よりも好きです。 – Petah

+0

@andrew ..はい私は以前にそのツールを使っていましたが、正規表現を理解している人にとってはdefです。 –

答えて

14

最後に.+$は、数字の文字列として取り込まれた最後の数字の後に少なくとも1文字必要です。それはキャプチャされたものを一桁消し去ります。あなたがそこにいる理由はありますか?

あなたはこのような*に最後+を変更することができます。それが必要だようにそれが見えない完全ので、

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

またはより良い、端部を取り除く:

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

ここでは、YouTube URLのクエリパラメータの任意の順序を許可し、そこにある必要はありません正規表現に物事を入れないあなたの関数を書くために少し安全な方法です。コードは長いですが、それははるかに堅牢だとより多くのプロバイダを追加する方がはるかに簡単になります:ここ

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

作業バージョンを:「+」http://jsfiddle.net/jfriend00/N2hPj/

+0

短い正規表現が勝ちます!私は第2のものと一緒に行きました。本当にありがとう! –

+0

@RyanEllis - FYI、YouTubeの文字列のクエリ引数の順序に敏感ではなく、vimeoとyoutubeの形式が混在する不正なURLを許可しない、より堅牢なバージョンの関数を追加しました。 – jfriend00

+0

素敵な仕事!私はちょうど私の古い機能をあなたのものに置き換えました、そして、それはより速く見えます(それがどんなに真実かわかりません) AWESOME機能に感謝し、それは他のビデオプロバイダーにとってもはるかに簡単です!このプロジェクト全体のバックポケットに入れてもいいですか? ;) –

0

最終数は、使用しているので、切断されます最後には、「1つまたは複数の任意の文字」を意味します。 「+」を「0以上」を意味する*で置き換えます。

+0

答えと説明をありがとう! –

2

正規表現を簡略化するために、haystack.indexOf(針)を使用して、URLがvimeoかyoutubeかどうかを確認し、サイト固有の正規表現を適用します。はるかに簡単で、後で正規表現を過度に複雑にすることなくビデオサイトを追加することができます。

+0

私はそれが好きです!これは、将来のために、より簡単になります、ありがとう! –

+0

おかげで助けてくれることを嬉しく思います:) –

0

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

0

最後を削除します。そして、ここで見つかった。ここ

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

3

に一致するエンドもyoutu.beで動作し、@のjfriend00のコードといくつかのコードを使用してURLをyoutube.com/embed更新されたバージョンです:JavaScript REGEX: How do I get the YouTube video id from a URL?

EDIT:実際に機能する関数で私の答え(およびフィドル)を更新しました。

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

と作業jsfiddle :-):2件のstackexchangeの回答のうち、http://jsfiddle.net/9n8Nn/3/

が、これは最後に私のために最善を働いたコードです。

+0

youtube IDは表示されません – Carlos

+1

それは謝罪です。何がうまくいかなかったのか分かりませんが、私は答えとフィドルを更新しました。 – reblevins

+0

誰かが "https://www.youtube.com/watch"のようなURLを渡すとどうなりますか エラーが表示されます - 未定義のプロパティ 'split'を読み取れません – anonymous

関連する問題