代码之家  ›  专栏  ›  技术社区  ›  Rob

c regex通过url从youtube和vimeo获取视频ID

  •  25
  • Rob  · 技术社区  · 14 年前

    我正忙于创建两个正则表达式来过滤YouTube和Vimeo视频中的ID。我已经得到了以下表达式;

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

    正如我在下面解释的,有两种类型的URL与我已经创建的正则表达式相匹配。vimeo和youtube中的其他几种URL没有被表达式覆盖。我最喜欢的是所有这些可以用两个表达式来描述。一个代表所有的Vimeo视频,一个代表所有的YouTube视频。我一直在尝试一些不同的表达方式,但到目前为止还没有成功。我仍在努力掌握正则表达式,所以我希望我的方法是正确的,有人能帮我!如果需要更多信息,请告诉我!

    Vimeo URL不匹配:

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

    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。

    回答后更新sedith:

    这就是我现在的表情

    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在数组中的索引,其中包含从regex返回的匹配项。但我希望它只返回id itselfs,所以当vimeo的youtube决定更改那里的URL时,我不需要修改代码。有什么建议吗?

    3 回复  |  直到 8 年前
        1
  •  60
  •   Septih    14 年前

    我对这些例子进行了讨论,并提出了以下几点:

    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

        2
  •  2
  •   Nikolay Kostov    8 年前

    如果您正在使用视图模型(例如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
  •  0
  •   j0k user1957683    12 年前

    Vimeo:

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