39

URLからキーでクエリ文字列を削除するには?

私はうまく動作する以下の方法を持っていますが、もっと良い/短い方法があるのではないかと思っていますか? または、より効率的に実行できる組み込みの.NETメソッドですか?

 public static string RemoveQueryStringByKey(string url, string key)
        {
            var indexOfQuestionMark = url.IndexOf("?");
            if (indexOfQuestionMark == -1)
            {
                return url;
            }

            var result = url.Substring(0, indexOfQuestionMark);
            var queryStrings = url.Substring(indexOfQuestionMark + 1);
            var queryStringParts = queryStrings.Split(new [] {'&'});
            var isFirstAdded = false;

            for (int index = 0; index <queryStringParts.Length; index++)
            {
                var keyValue = queryStringParts[index].Split(new char[] { '=' });
                if (keyValue[0] == key)
                {
                    continue;
                }

                if (!isFirstAdded)
                {
                    result += "?";
                    isFirstAdded = true;
                }
                else
                {
                    result += "&";
                }

                result += queryStringParts[index];
            }

            return result;
        }

たとえば、次のように呼び出すことができます。

  Console.WriteLine(RemoveQueryStringByKey(@"http://www.domain.com/uk_pa/PostDetail.aspx?hello=hi&xpid=4578", "xpid"));

質問が明確であることを願っています。

ありがとう、

4

15 に答える 15

109

これはうまくいきます:

public static string RemoveQueryStringByKey(string url, string key)
{                   
    var uri = new Uri(url);

    // this gets all the query string key value pairs as a collection
    var newQueryString = HttpUtility.ParseQueryString(uri.Query);

    // this removes the key if exists
    newQueryString.Remove(key);

    // this gets the page path from root without QueryString
    string pagePathWithoutQueryString = uri.GetLeftPart(UriPartial.Path);

    return newQueryString.Count > 0
        ? String.Format("{0}?{1}", pagePathWithoutQueryString, newQueryString)
        : pagePathWithoutQueryString;
}

例:

RemoveQueryStringByKey("https://www.google.co.uk/search?#hl=en&output=search&sclient=psy-ab&q=cookie", "q");

そして戻ります:

https://www.google.co.uk/search?#hl=en&output=search&sclient=psy-ab
于 2012-06-18T09:30:51.020 に答える
6
    var queryString = "hello=hi&xpid=4578";
    var qs = System.Web.HttpUtility.ParseQueryString(queryString);
    qs.Remove("xpid");
    var newQuerystring = qs.ToString();

これは .NET 5 でも機能します。

于 2012-06-15T14:53:19.610 に答える
2

これはかなり古い質問であることは知っていますが、私が読んだものはすべて少し複雑に感じました.

public Uri GetUriWithoutQueryParam( Uri originalUri, string paramKey ) {
  NameValueCollection newQuery = HttpUtility.ParseQueryString( originalUri.Query );
  newQuery.Remove( paramKey );
  return new UriBuilder( originalUri ) { Query = newQuery.ToString() }.Uri;
}
于 2021-02-03T21:46:32.140 に答える
1

これはどう:

        string RemoveQueryStringByKey(string url, string key)
    {
        string ret = string.Empty;

        int index = url.IndexOf(key);
        if (index > -1)
        {
            string post = string.Empty;

            // Find end of key's value
            int endIndex = url.IndexOf('&', index);
            if (endIndex != -1) // Last query string value?
            {
                post = url.Substring(endIndex, url.Length - endIndex);
            }

            // Decrement for ? or & character
            --index;
            ret = url.Substring(0, index) + post;
        }

        return ret;
    }
于 2012-06-15T14:56:51.310 に答える
1

正規表現を使用しない方法を見つけました:

private string RemoveQueryStringByKey(string sURL, string sKey) {
    string sOutput = string.Empty;

    int iQuestion = sURL.IndexOf('?');
    if (iQuestion == -1) return (sURL);

    int iKey = sURL.Substring(iQuestion).IndexOf(sKey) + iQuestion;
    if (iKey == -1) return (sURL);

    int iNextAnd = sURL.Substring(iKey).IndexOf('&') + iKey + 1;

    if (iNextAnd == -1) {
        sOutput = sURL.Substring(0, iKey - 1);
    }
    else {
        sOutput = sURL.Remove(iKey, iNextAnd - iKey);
    }

    return (sOutput);
}

最後に別のフィールドを追加してこれを試してみましたが、それでもうまくいきます。

于 2012-06-15T15:01:15.310 に答える
0

最短の方法(URLが最初から有効であると仮定して、すべての場合に有効なURLを生成すると信じgetRidOfています)は、この正規表現(削除しようとしている変数名はどこですか)を使用することであり、置換は長さゼロの文字列""):

(?<=[?&])getRidOf=[^&]*(&|$)

または多分

\bgetRidOf=[^&]*(&|$)

絶対にきれいなURL ではないかもしれませんが、すべて有効だと思います。

         INPUT                                         OUTPUT
      -----------                                   ------------
blah.com/blah.php?getRidOf=d.co&blah=foo        blah.com/blah.php?blah=foo
blah.com/blah.php?f=0&getRidOf=d.co&blah=foo    blah.com/blah.php?f=0&blah=foo
blah.com/blah.php?hello=true&getRidOf=d.co      blah.com/blah.php?hello=true&
blah.com/blah.php?getRidOf=d.co                 blah.com/blah.php?

これは単純な正規表現の置換です:

Dim RegexObj as Regex = New Regex("(?<=[?&])getRidOf=[^&]*(&|$)")
RegexObj.Replace("source.url.com/find.htm?replace=true&getRidOf=PLEASE!!!", "")

...結果は次の文字列になります。

"source.url.com/find.htm?replace=true&"

...これは、ASP.Net アプリケーションでは有効であるように思われますが、replace等しいtrue(そうではないtrue&、またはそのようなものではありません)

うまくいかない場合は、適応させてみます:)

于 2012-06-15T20:36:02.823 に答える
0

を削除する前のコードの下QueryString

 PropertyInfo isreadonly = 
          typeof(System.Collections.Specialized.NameValueCollection).GetProperty(
          "IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        // make collection editable
        isreadonly.SetValue(this.Request.QueryString, false, null);
        // remove
        this.Request.QueryString.Remove("yourKey");
于 2014-04-22T11:31:06.883 に答える
-1
string url = HttpContext.Current.Request.Url.AbsoluteUri;
string[] separateURL = url.Split('?');

NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(separateURL[1]);
queryString.Remove("param_toremove");

string revisedurl = separateURL[0] + "?" + queryString.ToString();
于 2016-09-14T13:16:59.583 に答える