web-dev-qa-db-ja.com

URLでyoutubeとvimeoからビデオIDを取得するC#正規表現

YouTubeとVimeoビデオのIDをフィルターするために2つの正規表現を作成しようと忙しくしています。私はすでに次の式を持っています。

YouTube: (youtube\.com/)(.*)v=([a-zA-Z0-9-_]+)
Vimeo: vimeo\.com/([0-9]+)$

以下で説明するように、すでに作成した正規表現に一致する2種類のURLがあります。 VimeoとYouTubeの他のいくつかのタイプのURLは、この表現ではカバーされていません。私が最も好むのは、これらすべてを2つの表現でカバーできることです。 1つはすべてのVimeoビデオ用、もう1つはすべてのYouTubeビデオ用です。私はいくつかの異なる表現を試すのに忙しかったが、今のところ成功していない。私はまだ正規表現を習得しようとしているので、私が正しい方法で、誰かが助けてくれることを願っています!さらに詳しい情報が必要な場合はお知らせください。

一致しないVIMEOURL:

http://vimeo.com/channels/hd#11384488
http://vimeo.com/groups/brooklynbands/videos/7906210
http://vimeo.com/staffpicks#13561592

YouTubeのURLが一致しません

http://www.youtube.com/user/username#p/a/u/1/bpJQZm_hkTE
http://www.youtube.com/v/bpJQZm_hkTE
http://youtu.be/bpJQZm_hkTE

一致したURL

http://www.youtube.com/watch?v=bWTyFIYPtYU&feature=popular
http://vimeo.com/834881

上記のすべてのURLを2つの正規表現と一致させるという考え方です。 1つはvimeo用、もう1つはyoutube用です。

回答後の更新セディス:

これが私の表現が今どのように見えるかです

public static readonly Regex VimeoVideoRegex = new Regex(@"vimeo\.com/(?:.*#|.*/videos/)?([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Multiline);
public static readonly Regex YoutubeVideoRegex = new Regex(@"youtu(?:\.be|be\.com)/(?:(.*)v(/|=)|(.*/)?)([a-zA-Z0-9-_]+)", RegexOptions.IgnoreCase);

そしてコードで私は持っています

var youtubeMatch = url.match(YoutubeVideoRegex );
var vimeoMatch = url.match(VimeoVideoRegex );

var youtubeIndex = (youtubeMatch.length - 1)
var youtubeId = youtubeMatch[youtubeIndex];

ご覧のとおり、regexから返された一致を含む配列内のvideoIdがあるインデックスを見つける必要があります。しかし、私はそれ自体がIDのみを返すようにしたいので、vimeoのyoutubeがそこのURLを変更することを決定したときにコードを変更する必要はありません。これに関するヒントはありますか?

26
Rob

私は例をいじってみて、これらを思いついた:

Youtube: youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)
Vimeo: vimeo\.com/(?:.*#|.*/videos/)?([0-9]+)

そして、それらは与えられたすべてのものと一致するはずです。 (?:...)は、ブラケット内のすべてがキャプチャされないことを意味します。したがって、IDのみを取得する必要があります。

私自身は少し正規表現の初心者なので、誰かが私に耳を貸さないように叫んでここに来ても驚かないでください。しかし、これらが役立つことを願っています。

このウェブサイトはパターンを理解するのに非常に役立つと思います: http://www.regexpal.com/

編集:

次のようにIDを取得します:

string url = ""; //url goes here!

Match youtubeMatch = YoutubeVideoRegex.Match(url);
Match vimeoMatch = VimeoVideoRegex.Match(url);

string id = string.Empty;

if (youtubeMatch.Success)
    id = youtubeMatch.Groups[1].Value; 

if (vimeoMatch.Success)
    id = vimeoMatch.Groups[1].Value;

それは普通の古いc#.netで機能し、asp.netを保証することはできません

60
Septih

ビューモデル(ASP.NET MVCなど)を使用してアプリケーションを作成している場合:

public string YouTubeUrl { get; set; }

public string YouTubeVideoId
{
    get
    {
        var youtubeMatch =
            new Regex(@"youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)")
            .Match(this.YouTubeUrl);
        return youtubeMatch.Success ? youtubeMatch.Groups[1].Value : string.Empty;
    }
}
2
Nikolay Kostov

Vimeo:

vimeo\.com/(?:.*#|.*/)?([0-9]+)
0
deype0