【问题标题】:C# regex to get video id from youtube and vimeo by urlC# 正则表达式通过 url 从 youtube 和 vimeo 获取视频 ID
【发布时间】:2011-04-08 19:10:42
【问题描述】:

我正忙于创建两个正则表达式来过滤来自 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

网址匹配

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 所在的索引,其中包含从正则表达式返回的匹配项。但我希望它只返回 id 本身,所以当 vimeo 的 youtube 决定更改那里的 url 时,我不需要修改代码。这方面有什么建议吗?

【问题讨论】:

    标签: c# asp.net .net regex youtube


    【解决方案1】:

    我尝试了这些示例并想出了这些:

    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

    【讨论】:

    • 谢谢!我已经完美地尝试了表达式和工作,但是当我测试时我发现只获取包含视频 ID 的部分 url 更方便,这可能吗?
    • 见上面的变化。 youtube 模式略有错误,但现在它们都应该在 match.Groups[1].Value 中捕获 id
    • 感谢您的好评!明天早上我会先试试这个,我会告诉你的!
    • 由于某种原因,当我尝试它时,视频 ID 在 match.Groups[4].Value 而不是 [1] 中。知道为什么吗? (C#.NET 4)。如果我在这里测试它,我会得到相同的结果:derekslager.com/blog/posts/2007/09/…
    • 把这个投入生产让我看起来很好 - 非常感谢:-)
    【解决方案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]+)
      

      【讨论】:

        猜你喜欢
        • 2012-03-22
        • 2014-11-05
        • 2020-12-21
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2018-02-25
        相关资源
        最近更新 更多