web-dev-qa-db-ja.com

URL文字列からクエリ文字列を抽出します

私は歴史から読んでいます、そして私がグーグルクエリに出くわしたとき、私はクエリ文字列を抽出できることを望みます。文字列を解析しているだけなので、requestや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アプリケーションにのみ含まれています。再度、感謝します

14
michelle

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の部分文字列を取得して、=記号の後のすべてを返します。この場合は妥当と思われる単一の一致があると想定されます。そうでない場合は、例外がスローされます。そうでない場合は、SingleWhereに置き換え、結果をループして、ループ内で同じ部分文字列操作を実行します。

編集:コメントに記載されているシナリオをカバーするために、この更新されたバージョンを使用できます:

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

if (query != null)
    Console.WriteLine(query.Substring(2));
21
Ahmad Mageed

System.Web.HttpUtilityを使用したくない場合(したがって、クライアントプロファイルを使用できる)、引き続き使用できます Mono HttpUtility.cs これは、使用できる独立した.csファイルのみです。アプリケーションに埋め込みます。次に、クラス内のParseQueryStringメソッドを使用して、クエリ文字列を適切に解析できます。

6
Teoman Soygul

これが解決策です-

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);

乾杯

3
Andrew

本当に自分で解析を行う必要があり、「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」値をサポートします(最後に「&」を付けないでください))

2

利用可能なツールを使用します。

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
Steve Wellens

そのため、 ri および HttpUtility.ParseQueryString を使用する必要があります。

1
Jim Mischel

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 も表示されます。