从 URL 字符串中提取查询字符串
本文关键字:字符串 查询 提取 URL | 更新日期: 2023-09-27 17:57:20
我正在阅读历史记录,我希望当我遇到谷歌查询时,我可以提取查询字符串。我没有使用请求或 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=,它会给我错误。
有什么建议吗?
感谢您的回答,一切似乎都很好:)附言:我不能使用httputility,不是我不想。当我添加对System.Web的引用时,不包括httputility!它仅包含在 asp.net 应用程序中。再次感谢
目前还不清楚为什么你不想使用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
,遍历结果并在循环中执行相同的子字符串操作。
编辑:为了涵盖评论中提到的场景,可以使用此更新版本:
int index = input.IndexOf('?');
var query = input.Substring(index + 1)
.Split('&')
.SingleOrDefault(s => s.StartsWith("q="));
if (query != null)
Console.WriteLine(query.Substring(2));
如果您不想使用System.Web.HttpUtility
(因此可以使用客户端配置文件),您仍然可以使用 Mono HttpUtility.cs它只是一个可以嵌入到应用程序中的独立.cs文件。然后,只需使用类中的 ParseQueryString
方法来正确分析查询字符串。
这是解决方案-
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;
}
为什么不创建一个代码来返回从q=
到下一个&
的字符串?
例如:
string s = historyString.Substring(url.IndexOf("q="));
int newIndex = s.IndexOf("&");
字符串 newString = s.Substring(0, newIndex);
干杯
使用可用的工具:
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"];
如果您确实需要自己进行解析,并且只对"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"值(末尾没有"&"))
这就是为什么你应该使用Uri和HttpUtility.ParseQueryString。
HttpUtility 适用于 .Net Framework。但是,该类不适用于 WinRT 应用。如果要从 Windows 应用商店应用中的 URL 获取参数,则需要使用 WwwFromUrlDecoder。您可以使用要从中获取参数的查询字符串从此类创建一个对象,该对象具有枚举器并且还支持 lambda 表达式。
下面是一个示例
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