首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析视频ID的URL

解析视频ID的URL
EN

Stack Overflow用户
提问于 2011-09-10 19:23:16
回答 3查看 3.5K关注 0票数 4

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

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

下面是链接的一个示例:

代码语言:javascript
运行
复制
http://www.youtube.com/watch?v=72xSxQIRelc&feature=youtube_gdata

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

代码语言:javascript
运行
复制
string vidID = 
    preURL.Substring(preURL.LastIndexOf("v=") + 2,
    preURL.Substring(preURL.LastIndexOf("v=") + 2).Length -
    preURL.Substring(preURL.LastIndexOf("&feature")).Length)

我在这里看到了一些能做到这一点的Regex东西。我在想,相对来说,我的方式是否非常低效。我也不是regex功夫向导,所以我不确定如果YouTube改变了v=结构,那么我看到的解决方案是否是可扩展的(在本例中,要求v=以及&feature是很难编码的)。

在我看来,我的解决方案仍然很棘手。有没有更有效的方法来做到这一点?

添加了

这个应用程序封装在一个silverlight解决方案中,所以我在这里应该提到这一点。

一种发布的解决方案是使用HttpUtility.ParseQueryString。这似乎是答案,直到我发现Silverlight的HttpUtility实现不包括ParseQueryString方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-10 20:02:10

那么,您应该只更新数据库,而不是

代码语言:javascript
运行
复制
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对象。

代码语言:javascript
运行
复制
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.Web.HttpUtility部分和System.Collections.Specialized.NameValueCollection的支持

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

因为HttpUtility已经是一个static对象,所以不能扩展它,但是您可以轻松地创建一些新的东西:

代码语言:javascript
运行
复制
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;
    }
}

然后使用:

代码语言:javascript
运行
复制
string videoId = MyHttpUtilities.ParseQueryString(youtube.Query)["v"],
       feature = MyHttpUtilities.ParseQueryString(youtube.Query)["feature"];
票数 3
EN

Stack Overflow用户

发布于 2011-09-10 19:40:29

为什么这么复杂?

就用已经存在的东西。这是个网址。它在这里已经30年了,试试看

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

票数 3
EN

Stack Overflow用户

发布于 2011-09-10 19:44:16

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

代码语言:javascript
运行
复制
    String[] splitedUrl=preURL.split("v=",StringSplitOptions.None);
    String[] splitedUrl2=splitedUrl[1].split('&');
    String vidID=splitedUrl2[0];

那你就会得到那个vidID。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7374041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档