Разбор URL для идентификатора видео - PullRequest
4 голосов
/ 10 сентября 2011

Раньше я вставлял видео с YouTube по ссылке в базе данных.

YouTube больше не позволяет мне вставлять таким образом.Вместо этого мне нужно извлечь идентификатор видео из URL, который я сохранил.

Вот пример ссылки:

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

Идентификатор, который мне нужно извлечь, - 72xSxQIRelc.Я знаю, что мог бы сделать что-то вроде:

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

Я видел кое-что из Regex, которое делает это.Мне интересно, если мой путь ужасно неэффективен, сравнительно.Я также не мастер регулярных выражений по кунг-фу, поэтому я не уверен, что решения, которые я вижу, являются масштабируемыми, если YouTube изменяет структуру URL (в этом случае это жестко задано как требование v =, а также & function).

Мое решение все еще кажется мне довольно хакерским.Есть ли более эффективный способ сделать это?


Добавлено

Это приложение обернуто в silverlight решение, поэтому я долженупомяните это здесь.

Одним из опубликованных решений было использование HttpUtility.ParseQueryString.Похоже, это был ответ, пока я не обнаружил, что реализация HttpUtility в Silverlight не включает метод ParseQueryString.

Ответы [ 3 ]

3 голосов
/ 11 сентября 2011

тогда вам просто нужно обновить базу данных нет ?

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%'; 

Тогда вы можете просто использовать идентификатор видео из базы данных ...

если вы загружаете идентификатор видео из ссылки на дыру, используйте объект 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 части 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;
    }
}

и затем используйте:

string videoId = MyHttpUtilities.ParseQueryString(youtube.Query)["v"],
       feature = MyHttpUtilities.ParseQueryString(youtube.Query)["feature"];
3 голосов
/ 10 сентября 2011

Почему это так сложно?

Просто используйте то, что уже существует. Это URL. Это было здесь в течение 30 лет, попробуйте это

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

1 голос
/ 10 сентября 2011

Попробуйте использовать метод String.split ():

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

Тогда у вас будет этот vidID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...