С# regex для получения идентификатора видео с youtube и vimeo по URL-адресу
Я занят попыткой создать два регулярных выражения для фильтрации идентификатора с 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 NOT MATCHED
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
Идея состоит в том, чтобы сопоставить все упомянутые выше ссылки с двумя регулярными выражениями. Один для 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. Любые советы по этому поводу?
Ответы
Ответ 1
У меня была игра с примерами и она придумала:
Youtube: youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)
Vimeo: vimeo\.com/(?:.*#|.*/videos/)?([0-9]+)
И они должны соответствовать всем этим. (?:...) означает, что все внутри скобки не будет захвачено. Таким образом, должен быть получен только идентификатор.
Я немного новичок в регулярном выражении, поэтому не удивляйтесь, если кто-то еще сюда кричит, чтобы не слушать меня, но, надеюсь, это поможет.
Я нахожу этот сайт чрезвычайно полезным при разработке шаблонов: http://www.regexpal.com/
Edit:
введите 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;
Это работает в обычном старом С#.net, не может ручаться за asp.net
Ответ 2
Если вы пишете какое-либо приложение с моделью просмотра (например, 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;
}
}
Ответ 3
Vimeo:
vimeo\.com/(?:.*#|.*/)?([0-9]+)