私は歴史から読んでいます、そして私がグーグルクエリに出くわしたとき、私はクエリ文字列を抽出できることを望みます。文字列を解析しているだけなので、requestやhttputilityは使用していません。ただし、このようなURLに遭遇すると、プログラムはそれを適切に解析できません。
私がやろうとしていたのは、q =のインデックスと&のインデックスを取得し、その間の単語を取得することですが、この場合、&のインデックスはq =よりも小さくなり、エラーが発生します。
助言がありますか?
あなたの答えに感謝します、すべてが良さそうです:) p.s.私は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( "&");
string newString = s.Substring(0、newIndex);
乾杯
本当に自分で解析を行う必要があり、「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」値をサポートします(最後に「&」を付けないでください))
利用可能なツールを使用します。
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"];
そのため、 ri および HttpUtility.ParseQueryString を使用する必要があります。
HttpUtilityは、.NetFrameworkには適しています。ただし、そのクラスはWinRTアプリでは使用できません。 WindowsストアアプリのURLからパラメーターを取得する場合は、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 も表示されます。