2010-09-06 86 views
24

Tôi đang cố gắng tạo hai biểu thức chính quy để lọc id từ youtube và video vimeo. Tôi đã có các biểu thức sau đây;C# regex để lấy id video từ youtube và vimeo bằng url

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

Như tôi đã giải thích bên dưới, có 2 loại url khớp với cụm từ thông dụng mà tôi đã tạo. Một số loại url khác từ Vimeo và YouTube không bị che đậy bởi các biểu thức. Những gì tôi thích nhất là tất cả điều này có thể được bao gồm trong hai biểu thức. Một cho tất cả các video của Vimeo và một cho tất cả các video youtube. Tôi đã bận rộn thử nghiệm với một số biểu thức khác nhau, nhưng không có succes cho đến nay. Tôi vẫn đang cố gắng nắm vững các biểu thức thông thường, vì vậy tôi hy vọng tôi đang đi đúng hướng và ai đó có thể giúp tôi! Nếu cần thêm thông tin, vui lòng cho tôi biết!

URL

Vimeo không phù hợp:

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

YOUTUBE không phù hợp

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 khớp

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

Ý tưởng là để phù hợp với tất cả các url nêu trên với hai biểu thức thông thường . Một cho vimeo và một cho youtube.

CẬP NHẬT SAU ĐÁP Sedith:

Đây là cách biểu hiện của tôi trông tại

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

Và trong mã tôi có

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

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

Như bạn có thể thấy tôi bây giờ cần phải tìm các chỉ số trong đó videoId nằm trong mảng có các kết quả phù hợp được trả lại từ regex. Nhưng tôi muốn nó chỉ trả lại id chính nó, vì vậy tôi không cần phải sửa đổi mã khi youtube của vimeo bao giờ quyết định thay đổi url. Bất kỳ lời khuyên về điều này?

Trả lời

58

Tôi đã có một vở kịch xung quanh với các ví dụ và đã đưa ra những:

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

Và họ phải phù hợp với tất cả những định. (?: ...) có nghĩa là mọi thứ bên trong khung sẽ không bị bắt. Vì vậy, chỉ nên lấy id.

Tôi là một chút của một người mới regex bản thân mình, vì vậy đừng ngạc nhiên nếu có ai khác đến đây la hét không lắng nghe tôi, nhưng hy vọng những điều này sẽ giúp đỡ.

Tôi thấy trang web này rất hữu ích trong việc xây dựng các mô hình: http://www.regexpal.com/

Edit:

nhận được id như vậy:

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; 

đó làm việc tại đồng bằng cũ C# .net, có thể 't chứng minh cho asp.net

+0

Cảm ơn! Tôi đã thử các biểu thức và công việc một cách hoàn hảo, nhưng trong khi tôi đã được thử nghiệm tôi phát hiện ra nó thuận tiện hơn để chỉ nhận được một phần của url chứa id video, điều này có thể? – Rob

+2

Xem các thay đổi ở trên. Các mô hình youtube là hơi sai nhưng bây giờ cả hai người trong số họ nên có id bị bắt trong match.Groups [1] .Value – Septih

+0

Cảm ơn bạn đã phản ứng tốt! Tôi sẽ thử điều đầu tiên này, và tôi sẽ cho bạn biết! – Rob

0

Vimeo:

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

Trong trường hợp bạn đang viết một số ứng dụng với quan điểm mô hình (ví dụ 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; 
    } 
} 
Các vấn đề liên quan