C# 正则表达式通过 url 从 youtube 和 vimeo 获取视频 ID
Posted
技术标签:
【中文标题】C# 正则表达式通过 url 从 youtube 和 vimeo 获取视频 ID【英文标题】:C# regex to get video id from youtube and vimeo by url 【发布时间】: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/***lynbands/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 时,我不需要修改代码。这方面有什么建议吗?
【问题讨论】:
【参考方案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]+)
【讨论】:
以上是关于C# 正则表达式通过 url 从 youtube 和 vimeo 获取视频 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 中的正则表达式从 YouTube URL 获取视频 ID
YouTube Vimeo 视频 ID 来自嵌入代码或来自带有 PHP 正则表达式 RegEx 的 URL
使用正则表达式的 jQuery Youtube URL 验证