C # регулярное выражение для получения идентификатора видео с YouTube и Vimeo по URL - PullRequest
25 голосов
/ 06 сентября 2010

Я занят, пытаясь создать два регулярных выражения для фильтрации идентификатора из видео YouTube и Vimeo. Я уже получил следующие выражения:

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

Как я объяснил ниже, есть 2 типа URL, которые соответствуют регулярным выражениям, которые я уже создал. Несколько других типов URL-адресов из Vimeo и YouTube не охватываются выражениями. Что я предпочитаю больше всего, так это то, что все это можно описать двумя выражениями. Один для всех видео Vimeo и один для всех видео YouTube. Я был занят экспериментированием с разными выражениями, но пока безуспешно. Я все еще пытаюсь освоить регулярные выражения, поэтому я надеюсь, что я на правильном пути, и кто-нибудь может мне помочь! Если требуется дополнительная информация, пожалуйста, дайте мне знать!

URL VIMEO НЕ СОГЛАСОВАНЫ:

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

URL-адреса YOUTUBE НЕ СОГЛАСОВАНЫ

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 с двумя регулярными выражениями. Один для Vimeo и один для 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];

Как вы видите, теперь мне нужно найти индекс, где videoId находится в массиве с совпадениями, возвращенными из регулярного выражения. Но я хочу, чтобы он возвращал только сам идентификатор, поэтому мне не нужно изменять код, когда youtube из vimeo когда-либо решит изменить там URL-адреса. Любые советы по этому поводу?

Ответы [ 3 ]

60 голосов
/ 06 сентября 2010

Я поэкспериментировал с примерами и придумал:

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

И они должны соответствовать всем данным. (?: ...) означает, что все внутри скобки не будет захвачено. Таким образом, только идентификатор должен быть получен.

Я сам новичок в области регулярных выражений, так что не удивляйтесь, если кто-нибудь придет сюда с криком не слушать меня, но, надеюсь, это поможет.

Я считаю этот сайт чрезвычайно полезным при разработке шаблонов: http://www.regexpal.com/

Edit:

получить идентификатор так:

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

2 голосов
/ 17 февраля 2016

Если вы пишете какое-либо приложение с моделью представления (например, 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;
    }
}
0 голосов
/ 19 сентября 2012

Vimeo:

vimeo\.com/(?:.*#|.*/)?([0-9]+)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...