2012-06-15 34 views
23

如何从Url中通过Key删除查询字符串?如何通过密钥从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")); 

希望这个问题是清楚的。

感谢,

+1

的[URL查询字符串可能重复 - 查找,替换,添加,更新值?](http://stackoverflow.com/questions/1163956/url-querystring-find-replace-add-update-values) –

+0

标签:'reinventing-the-wheel'['System.Web.HttpUtility.ParseQueryString'] –

+0

既没有完整的解决方案,也没有回答问题。 –

回答

60

这种运作良好的情况下,以适应它:

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/#hl=en&output=search&sclient=psy-ab 
+0

使用最少编码获得+1成功。 – Hoque

+1

字符串不包含FormatWith方法的定义 – rahularyansharma

+0

有没有办法做到这一点,而不使用FormatWith?这在.NET 4.0中不可用 – NickG

1
var qs = System.Web.HttpUtility.ParseQueryString(queryString); 
var str = qs.Get(key); 

这个助手类也有设置方法。

+2

这不是一个完整的解决方案。 – NickV

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; 
    } 
+0

无法正常工作.... – Ash

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

我做了,并在最后加入另一场试试这个,和它的作品没关系。

+0

无法正常工作,我需要开始创建自己的代码 – Ash

0

我想在最短的方法(我相信产生在所有情况下有效的URL,假设URL是有效的,开始用)是使用这个表达式(其中getRidOf是你想的变量名以除去)和置换是零长度的字符串""):

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

,或者甚至

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

同时可能不是绝对PR ettiest的网址,我认为他们都是有效的:

  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&或类似的东西)

,我会尝试,如果你有,它不会工作:)

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"); 
0
public static string RemoveQueryStringByKey(string sURL, string sKey) 
    { 
     string sOutput = string.Empty; 
     string sToReplace = string.Empty; 

     int iFindTheKey = sURL.IndexOf(sKey); 
     if (iFindTheKey == -1) return (sURL); 

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

     string sEverythingBehindQ = sURL.Substring(iQuestion); 
     List<string> everythingBehindQ = new List<string>(sEverythingBehindQ.Split('&')); 
     foreach (string OneParamPair in everythingBehindQ) 
     { 
      int iIsKeyInThisParamPair = OneParamPair.IndexOf(sKey); 
      if (iIsKeyInThisParamPair != -1) 
      { 
       sToReplace = "&" + OneParamPair; 
      } 
     } 

     sOutput = sURL.Replace(sToReplace, ""); 
     return (sOutput); 
    } 
-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(); 
+0

未处理的情况下,当没有查询 – Pavel

0

对不起,这是一个有点脏,但应在旧的框架工作

public String RemoveQueryString(String rawUrl , String keyName) 
{ 
    var currentURL_Split = rawUrl.Split('&').ToList(); 
    currentURL_Split = currentURL_Split.Where(o => !o.ToLower().StartsWith(keyName.ToLower()+"=")).ToList(); 
    String New_RemovedKey = String.Join("&", currentURL_Split.ToArray()); 
    New_RemovedKey = New_RemovedKey.Replace("&&", "&"); 
    return New_RemovedKey; 
} 
0

这里是我的解决方案:

心中已经增加了一些额外的输入验证。

public static void TryRemoveQueryStringByKey(ref string url, string key) 
{ 
    if (string.IsNullOrEmpty(url) || 
     string.IsNullOrEmpty(key) || 
     Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute) == false) 
    { 
     return false; 
    }    

    try 
    { 
     Uri uri = new Uri(url); 

     // This gets all the query string key value pairs as a collection 
     NameValueCollection queryCollection = HttpUtility.ParseQueryString(uri.Query); 
     string keyValue = queryCollection.Get(key); 

     if (url.IndexOf("&" + key + "=" + keyValue, StringComparison.OrdinalIgnoreCase) >= 0) 
     { 
      url = url.Replace("&" + key + "=" + keyValue, String.Empty); 
      return true; 
     } 
     else if (url.IndexOf("?" + key + "=" + keyValue, StringComparison.OrdinalIgnoreCase) >= 0) 
     { 
      url = url.Replace("?" + key + "=" + keyValue, String.Empty); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch 
    { 
     return false; 
    } 
} 

一些单元测试的例子:

string url1 = "http://www.gmail.com?a=1&cookie=cookieValue" 
Assert.IsTrue(TryRemoveQueryStringByKey(ref url1,"cookie")); //OUTPUT: "http://www.gmail.com?a=1" 

string url2 = "http://www.gmail.com?cookie=cookieValue" 
Assert.IsTrue(TryRemoveQueryStringByKey(ref url2,"cookie")); //OUTPUT: "http://www.gmail.com" 

string url3 = "http://www.gmail.com?cookie=" 
Assert.IsTrue(TryRemoveQueryStringByKey(ref url2,"cookie")); //OUTPUT: "http://www.gmail.com" 
0

我们也能做到这一点使用正则表达式

string queryString = "Default.aspx?Agent=10&Language=2"; //Request.QueryString.ToString(); 
string parameterToRemove="Language"; //parameter which we want to remove 
string regex=string.Format("(&{0}=[^&\s]+|{0}=[^&\s]+&?)",parameterToRemove); 
string finalQS = Regex.Replace(queryString, regex, ""); 

https://regexr.com/3i9vj