从.net中的youtube网址中提取视频ID

Men*_*gis 6 .net c# regex

我正在努力使用正则表达式从youtube网址中提取视频ID.

"(?:.+?)?(?:\\/v\\/|watch\\/|\\?v=|\\&v=|youtu\\.be\\/|\\/v=|^youtu\\.be\\/)([a-zA-Z0-9_-]{11})+";

它正在工作,因为它匹配视频ID,但我想在youtube域限制它,如果域名与youtube.com或youtu.be不同,我不希望它与id匹配.不幸的是我无法理解这个正则表达式来应用限制.

我想只在域名时匹配id:

  • www.youtube.com
  • youtube.com
  • youtu.be
  • www.youtu.be

在前面使用http或https(或不使用)

上面提到的正则表达式成功匹配以下示例的youtube id:

"http://youtu.be/AAAAAAAAA01"
"http://www.youtube.com/embed/watch?feature=player_embedded&v=AAAAAAAAA02"
"http://www.youtube.com/embed/watch?v=AAAAAAAAA03"
"http://www.youtube.com/embed/v=AAAAAAAAA04"
"http://www.youtube.com/watch?feature=player_embedded&v=AAAAAAAAA05"
"http://www.youtube.com/watch?v=AAAAAAAAA06"
"http://www.youtube.com/v/AAAAAAAAA07"
"www.youtu.be/AAAAAAAAA08"
"youtu.be/AAAAAAAAA09"
"http://www.youtube.com/watch?v=i-AAAAAAA14&feature=related"
"http://www.youtube.com/attribution_link?u=/watch?v=AAAAAAAAA15&feature=share&a=9QlmP1yvjcllp0h3l0NwuA"
"http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=AAAAAAAAA16&feature=em-uploademail"
"http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=AAAAAAAAA17"
"http://www.youtube.com/v/A-AAAAAAA18?fs=1&rel=0"
"http://www.youtube.com/watch/AAAAAAAAA11"
Run Code Online (Sandbox Code Playgroud)

现在检查URL的当前代码是:

private const string YoutubeLinkRegex = "(?:.+?)?(?:\\/v\\/|watch\\/|\\?v=|\\&v=|youtu\\.be\\/|\\/v=|^youtu\\.be\\/)([a-zA-Z0-9_-]{11})+";
    private static Regex regexExtractId = new Regex(YoutubeLinkRegex, RegexOptions.Compiled);


    public string ExtractVideoIdFromUrl(string url)
    {
        //extract the id
        var regRes = regexExtractId.Match(url);
        if (regRes.Success)
        {
            return regRes.Groups[1].Value;
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

tym*_*167 18

这里不需要使用正则表达式

var url = @"https://www.youtube.com/watch?v=6QlW4m9xVZY";
var uri = new Uri(url);

// you can check host here => uri.Host <= "www.youtube.com"

var query = HttpUtility.ParseQueryString(uri.Query);
var videoId = query["v"];

// videoId = 6QlW4m9xVZY
Run Code Online (Sandbox Code Playgroud)

好的,当你有v = videoId作为参数时,上面的例子是有效的.如果您将videoId作为细分,则可以使用:

var url = "http://youtu.be/AAAAAAAAA09";
var uri = new Uri(url);

var videoid = uri.Segments.Last(); // AAAAAAAAA09
Run Code Online (Sandbox Code Playgroud)

将所有这些结合在一起,我们就能得到

var url = @"https://www.youtube.com/watch?v=Lvcyj1GfpGY&list=PLolZLFndMkSIYef2O64OLgT-njaPYDXqy";
var uri = new Uri(url);

// you can check host here => uri.Host <= "www.youtube.com"

var query = HttpUtility.ParseQueryString(uri.Query);

var videoId = string.Empty;

if (query.AllKeys.Contains("v"))
{
    videoId = query["v"];
}
else
{
    videoId = uri.Segments.Last();
}
Run Code Online (Sandbox Code Playgroud)

当然,我对你的要求一无所知,但是,希望它有所帮助.

  • 当存在其他更具可读性的选项时,我个人不喜欢使用 RegEx - 我比我自己的更喜欢这个答案:) (2认同)

Men*_*gis 6

问题是正则表达式无法在挖掘操作之前检查所需的字符串,同时将此字符串用作挖掘操作本身。

例如,让我们检查"http://www.youtu.be/v/AAAAAAAAA07" URL 开头的 YouTu.be 是必需的,但挖掘操作是"/v/(11 chars)"

"http://www.youtu.be/AAAAAAAAA07"采矿行动是"youtu.be/(11 chars)"

这不能在同一个正则表达式中,这就是为什么我们不能在同一个正则表达式中检查域提取 id 的原因。

我决定从有效域列表中检查域权限,然后从 URL 中提取 id。

 private const string YoutubeLinkRegex = "(?:.+?)?(?:\\/v\\/|watch\\/|\\?v=|\\&v=|youtu\\.be\\/|\\/v=|^youtu\\.be\\/)([a-zA-Z0-9_-]{11})+";
 private static Regex regexExtractId = new Regex(YoutubeLinkRegex, RegexOptions.Compiled);
 private static string[] validAuthorities = { "youtube.com", "www.youtube.com", "youtu.be", "www.youtu.be" };

 public string ExtractVideoIdFromUri(Uri uri)
 {
     try
     {
        string authority = new UriBuilder(uri).Uri.Authority.ToLower();

        //check if the url is a youtube url
        if (validAuthorities.Contains(authority))
        {
            //and extract the id
            var regRes = regexExtractId.Match(uri.ToString());
            if (regRes.Success)
            {
                return regRes.Groups[1].Value;
            }
        }
     }catch{}


     return null;
 }
Run Code Online (Sandbox Code Playgroud)

UriBuilder是首选,因为它可以理解比Uri类更广泛的 URL 。它可以Uri从不包含方案的 URL创建,例如"youtube.com".

该函数使用以下测试 URL 返回 null(正确):

"ww.youtube.com/v/AAAAAAAAA13"
"http:/www.youtube.com/v/AAAAAAAAA13"
"http://www.youtub1e.com/v/AAAAAAAAA13"
"http://www.vimeo.com/v/AAAAAAAAA13"
"www.youtube.com/b/AAAAAAAAA13"
"www.youtube.com/v/AAAAAAAAA1"
"www.youtube.com/v/AAAAAAAAA1&"
"www.youtube.com/v/AAAAAAAAA1/"
".youtube.com/v/AAAAAAAAA13"
Run Code Online (Sandbox Code Playgroud)