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

Rob*_*Rob 26 .net c# regex youtube asp.net

我正忙着创建两个正则表达式来过滤来自youtube和vimeo视频的id.我已经有了以下表达式;

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

正如我在下面解释的那样,有两种类型的网址与我已创建的正则表达式相匹配.来自Vimeo和YouTube的其他几种网址并未被表达所覆盖.我最喜欢的是所有这些都可以用两个表达式来涵盖.一个适用于所有Vimeo视频,一个适用于所有YouTube视频.我一直在忙着尝试一些不同的表达方式,但到目前为止还没有成功.我还在尝试掌握正则表达式,所以我希望我能以正确的方式来帮助我!如果需要更多信息,请告诉我!

VIMEO网址不匹配:

http://vimeo.com/channels/hd#11384488
http://vimeo.com/groups/brooklynbands/videos/7906210
http://vimeo.com/staffpicks#13561592
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

匹配的网址

http://www.youtube.com/watch?v=bWTyFIYPtYU&feature=popular
http://vimeo.com/834881
Run Code Online (Sandbox Code Playgroud)

我们的想法是将上面提到的所有网址与两个正则表达式相匹配.一个用于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);
Run Code Online (Sandbox Code Playgroud)

在我的代码中

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

var youtubeIndex = (youtubeMatch.length - 1)
var youtubeId = youtubeMatch[youtubeIndex];
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我现在需要找到videoId在数组中的索引,其中正则表达式返回匹配项.但我希望它只返回id本身,所以我不需要修改代码,当你的vimeo决定改变那里的网址时.关于这个的任何提示?

Sep*_*tih 62

我玩了一些例子并想出了这些:

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

他们应该匹配所有给定的.(?:...)表示不会捕获括号内的所有内容.所以只应该获得id.

我自己也是一个正则表达式的新手,所以如果有人在这里尖叫不要听我的话也不要感到惊讶,但希望这些会有所帮助.

我发现这个网站在制定模式时非常有用:http://www.regexpal.com/

编辑:

得到这样的身份:

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;
Run Code Online (Sandbox Code Playgroud)

这适用于普通的旧c#.net,不能担保asp.net

  • 出于某种原因,当我尝试它时,视频ID在match.Groups [4] .Value而不是[1].知道为什么吗?(C#.NET 4).如果我在这里测试它,我会得到相同的结果:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx (6认同)
  • 见上述变化.youtube模式略有错误,但现在它们都应该在match.Groups [1] .Value中捕获id. (2认同)