解析URL获取视频ID

本文关键字:ID 视频 获取 URL 解析 | 更新日期: 2023-09-27 18:08:06

我曾经通过我在数据库中的链接嵌入YouTube视频。

YouTube不再允许我以这种方式嵌入。相反,我需要从我存储的URL中提取视频ID。

下面是一个链接的例子:

http://www.youtube.com/watch?v=72xSxQIRelc&feature=youtube_gdata

我需要提取的ID为72xSxQIRelc。我知道我可以这样做:

string vidID = 
    preURL.Substring(preURL.LastIndexOf("v=") + 2,
    preURL.Substring(preURL.LastIndexOf("v=") + 2).Length -
    preURL.Substring(preURL.LastIndexOf("&feature")).Length)

我在这里看到一些Regex的东西是这样做的。我在想,相对而言,我的方式是不是效率太低了。我也不是一个regex功夫向导,所以我不确定我看到的解决方案是否可扩展,如果YouTube改变URL结构(在这种情况下,它是硬编码要求v=以及&功能)。

我的解决方案对我来说仍然很粗糙。有没有更有效的方法?


添加

这个应用程序被包裹在silverlight解决方案中,所以我应该在这里提到它。

一个张贴的解决方案是使用httutility . parsequerystring。这看起来像是答案,直到我发现Silverlight的HttpUtility实现不包括ParseQueryString方法。

解析URL获取视频ID

那么你应该只是更新你的数据库没有?

UPDATE 
    [VideosTable]
SET
    video_url = 
        SUBSTRING(
            video_url, 
            CHARINDEX('v=', video_url) + 2,
            CHARINDEX('&', video_url, CHARINDEX('v=', video_url)) -
            (CHARINDEX('v=', video_url) + 2)
        )
WHERE
    video_url LIKE '%youtube.com%'; 

然后你可以简单地使用来自数据库的视频ID…

如果您是从孔链接上传视频ID,则使用URI对象代替

Uri youtube = new Uri("http://www.youtube.com/watch?v=72xSxQIRelc&feature=youtube_gdata");
string videoId = HttpUtility.ParseQueryString(youtube.Query)["v"];

Silverlight更新

Silveright缺少两个东西,System.Web.HttpUtilitySystem.Collections.Specialized.NameValueCollection部分的ParseQueryString支持

那么,为什么不自己添加这个功能呢?

因为HttpUtility已经是一个static对象,所以你不能扩展它,但是你可以很容易地创建一个新的对象:

public static class MyHttpUtilities
{
    public static System.Collections.Generic.Dictionary<string, string>
        ParseQueryString(this string queryString)
    {
        System.Collections.Generic.Dictionary<string, string> r = 
            new Dictionary<string, string>();
        // remove extra noise
        queryString = queryString.TrimStart('?').Replace("amp;", ""); 
        // split up and fill up Dictionary
        foreach (string s in queryString.Split('&'))
        {
            if (s.Contains('='))
            {
                string[] par = s.Split('=');
                r.Add(par[0], par[1]);
            }
        }
        return r;
    }
}

,然后使用:

string videoId = MyHttpUtilities.ParseQueryString(youtube.Query)["v"],
       feature = MyHttpUtilities.ParseQueryString(youtube.Query)["feature"];

为什么把它弄得这么复杂?

只使用已经存在的。它是一个url。它已经在这里30年了,试试这个

http://www.stev.org/post/2011/06/27/C-HowTo-Parse-a-URL.aspx

尝试使用String.split()方法:

    String[] splitedUrl=preURL.split("v=",StringSplitOptions.None);
    String[] splitedUrl2=splitedUrl[1].split('&');
    String vidID=splitedUrl2[0];

然后是vidID