解析视频ID的URL

时间:2011-09-10 19:23:17

标签: c# silverlight silverlight-4.0

我曾经通过我在数据库中的链接嵌入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)

我在这里看到了一些正则表达式的东西。我想知道我的方式是否非常低效,相对而言。我也不是一个正则表达式的功夫向导,所以我不确定如果YouTube更改了URL结构,我看到的解决方案是否可扩展(在这种情况下,它的硬编码要求v =以及& feature )。

我的解决方案对我来说似乎仍然非常苛刻。有没有更有效的方法呢?


这个应用程序包含在 silverlight 解决方案中,所以我应该在这里提一下。

一个已发布的解决方案是使用HttpUtility.ParseQueryString。看起来这就是答案,直到我发现Silverlight的HttpUtility实现不包括ParseQueryString方法。

3 个答案:

答案 0 :(得分:3)

为什么要这么复杂?

只需使用已存在的内容即可。它是一个网址。它在这里待了30年,试试这个

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

答案 1 :(得分:3)

那么您应该只更新数据库

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缺少两件事,即对ParseQueryString的{​​{1}}部分和System.Web.HttpUtility

的支持

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

由于System.Collections.Specialized.NameValueCollection已经是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;
    }
}

答案 2 :(得分:1)

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

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

然后你将拥有该视频ID。