Извлечь строку запроса из строки URL
Я читаю из истории, и я хочу, чтобы, когда я сталкивался с запросом 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. Еще раз спасибо
Ответы
Ответ 1
Непонятно, почему вы не хотите использовать 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));
Ответ 2
Если вы не хотите использовать System.Web.HttpUtility
(таким образом, сможете использовать профиль клиента), вы можете использовать Mono HttpUtility.cs, который является только независимым файлом .cs, который вы можете встроить в свое приложение. Затем вы можете просто использовать метод ParseQueryString
внутри класса для правильного анализа строки запроса.
Ответ 3
вот решение -
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;
}
Ответ 4
Почему бы вам не создать код, который возвращает строку с q=
далее до следующего &
?
Например:
string s = historyString.Substring(url.IndexOf( "q =" ));
int newIndex = s.IndexOf( "&" );
string newString = s.Substring(0, newIndex);
Приветствия
Ответ 5
Если вам действительно нужно провести синтаксический анализ, и вас интересует только значение "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" в конце строки запроса (без конца "&" в конце))
Ответ 6
Используйте доступные инструменты:
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"];
Ответ 7
И вот почему вы должны использовать Uri и HttpUtility.ParseQueryString.
Ответ 8
HttpUtility отлично подходит для .NET Framework. Однако этот класс недоступен для приложений WinRT. Если вы хотите получить параметры с URL-адреса в приложении Windows Store, вам необходимо использовать 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