извлечь строку запроса из строки URL - PullRequest
13 голосов
/ 21 мая 2011

Я читаю из истории и хочу, чтобы, сталкиваясь с запросом Google, я мог извлечь строку запроса. Я не использую запрос или httputility, так как я просто анализирую строку. однако, когда я сталкиваюсь с такими URL-адресами, моя программа не может правильно ее проанализировать:

http://www.google.com.mt/search?client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&channel=s&hl=mt&source=hp&biw=986&bih=663&q=hotmail&meta=&btnG=Fittex+bil-Google

что я пытался сделать, это получить индекс q = и индекс & и взять слова между ними, но в этом случае индекс & будет меньше, чем q =, и это даст мне ошибки.

есть предложения?

спасибо за ваши ответы, все, кажется, хорошо :) p.s. я не мог использовать httputility, не хочу. Когда я добавляю ссылку на system.web, httputility не включается! он включен только в приложение asp.net. Еще раз спасибо

Ответы [ 8 ]

21 голосов
/ 21 мая 2011

Непонятно, почему вы не хотите использовать HttpUtility.Вы всегда можете добавить ссылку на System.Web и использовать ее:

var parsedQuery = HttpUtility.ParseQueryString(input);
Console.WriteLine(parsedQuery["q"]);

Если это не вариант, возможно, этот подход поможет:

var query = input.Split('&')
                 .Single(s => s.StartsWith("q="))
                 .Substring(2);
Console.WriteLine(query);

Он разбивается на &и ищет единственный результат разделения, который начинается с "q=" и берет подстроку в позиции 2, чтобы вернуть все после знака =.Предполагается, что будет одно совпадение, что представляется разумным для этого случая, в противном случае будет выдано исключение.Если это не так, тогда замените Single на Where, зациклите результаты и выполните ту же операцию с подстрокой в ​​цикле.

EDIT: , чтобы охватить сценарий, упомянутый вкомментарии, эта обновленная версия может быть использована:

int index = input.IndexOf('?');
var query = input.Substring(index + 1)
                 .Split('&')
                 .SingleOrDefault(s => s.StartsWith("q="));

if (query != null)
    Console.WriteLine(query.Substring(2));
6 голосов
/ 21 мая 2011

Если вы не хотите использовать System.Web.HttpUtility (таким образом, сможете использовать профиль клиента), вы все равно можете использовать Mono HttpUtility.cs , который является только независимым файлом .cs, который вы можетевставлять в ваше приложение.Затем вы можете просто использовать метод ParseQueryString внутри класса, чтобы правильно проанализировать строку запроса.

4 голосов
/ 10 декабря 2013

вот решение -

string GetQueryString(string url, string key)
{
    string query_string = string.Empty;

    var uri = new Uri(url);
    var newQueryString = HttpUtility.ParseQueryString(uri.Query);
    query_string = newQueryString[key].ToString();

    return query_string;
}
3 голосов
/ 21 мая 2011

Почему бы вам не создать код, который возвращает строку от q= и далее до следующего &?

Например:

string s = historyString.Substring (url.IndexOf ("q ="));

int newIndex = s.IndexOf ("&");

string newString = s.Substring (0, newIndex);

Приветствия

2 голосов
/ 21 мая 2011

Используйте доступные инструменты:

String UrlStr = "http://www.google.com.mt/search?client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&channel=s&hl=mt&source=hp&biw=986&bih=663&q=hotmail&meta=&btnG=Fittex+bil-Google";

NameValueCollection Items = HttpUtility.ParseQueryString(UrlStr);

String QValue = Items["q"];
2 голосов
/ 21 мая 2011

Если вам действительно нужно выполнить синтаксический анализ самостоятельно, и вас интересует только значение для 'q', тогда сработает следующее:

        string url = @"http://www.google.com.mt/search?" +
            "client=firefoxa&rls=org.mozilla%3Aen-" +
            "US%3Aofficial&channel=s&hl=mt&source=hp&" +
            "biw=986&bih=663&q=hotmail&meta=&btnG=Fittex+bil-Google";

        int question = url.IndexOf("?");
        if(question>-1)
        {
            int qindex = url.IndexOf("q=", question);
            if (qindex > -1)
            {
                int ampersand = url.IndexOf('&', qindex);
                string token = null;

                if (ampersand > -1)
                    token = url.Substring(qindex+2, ampersand - qindex - 2);
                else
                    token = url.Substring(qindex+2);

                Console.WriteLine(token);
            }
        }

Но попробуйте взглянуть на использование правильного парсера URL, это избавит вас от многих хлопот в будущем.

(исправил этот вопрос, включив проверку на токен '?' И поддерживая значения 'q' в конце строки запроса (без знака '&' в конце))

1 голос
/ 08 мая 2013

HttpUtility подходит для .Net Framework. Однако этот класс недоступен для приложений WinRT. Если вы хотите получить параметры из URL-адреса в приложении Магазина Windows, вам необходимо использовать WwwFromUrlDecoder. Вы создаете объект из этого класса со строкой запроса, из которой вы хотите получить параметры, объект имеет перечислитель и поддерживает также лямбда-выражения.

Вот пример

var stringUrl = "http://localhost/?name=Jonathan&lastName=Morales";
var decoder = new WwwFormUrlDecoder(stringUrl);
//Using GetFirstByName method
string nameValue = decoder.GetFirstByName("name");
//nameValue has "Jonathan"

//Using Lambda Expressions
var parameter = decoder.FirstOrDefault(p => p.Name.Contains("last")); //IWwwFormUrlDecoderEntry variable type
string parameterName = parameter.Name; //lastName
string parameterValue = parameter.Value; //Morales

Вы также можете увидеть http://www.dzhang.com/blog/2012/08/21/parsing-uri-query-strings-in-windows-8-metro-style-apps

1 голос
/ 21 мая 2011

И вот почему вы должны использовать Uri и HttpUtility.ParseQueryString .

...