我正在努力使用正则表达式从youtube网址中提取视频ID.
"(?:.+?)?(?:\\/v\\/|watch\\/|\\?v=|\\&v=|youtu\\.be\\/|\\/v=|^youtu\\.be\\/)([a-zA-Z0-9_-]{11})+";
它正在工作,因为它匹配视频ID,但我想在youtube域限制它,如果域名与youtube.com或youtu.be不同,我不希望它与id匹配.不幸的是我无法理解这个正则表达式来应用限制.
我想只在域名时匹配id:
在前面使用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)
当然,我对你的要求一无所知,但是,希望它有所帮助.
问题是正则表达式无法在挖掘操作之前检查所需的字符串,同时将此字符串用作挖掘操作本身。
例如,让我们检查"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)
| 归档时间: |
|
| 查看次数: |
8231 次 |
| 最近记录: |