2012-06-15 9 views
23

एक यूआरएल से कुंजी द्वारा क्वेरी स्ट्रिंग को कैसे निकालें?यूआरएल से कुंजी द्वारा क्वेरी स्ट्रिंग को कुशलता से कैसे हटाएं?

मेरे पास निम्न कार्य है जो ठीक काम करता है लेकिन बस सोच रहा है कि कोई बेहतर/छोटा तरीका है? या एक अंतर्निहित .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

की [यूआरएल क्वेरी स्ट्रिंग संभव डुप्लिकेट - खोजें, की जगह, जोड़ने के लिए, मूल्यों को अद्यतन करें?] (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

मैं Regex का उपयोग किए बिना एक रास्ता मिल गया:

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 पैदा करता है यह सोचते हैं यूआरएल के साथ शुरू करने के लिए वैध था) सोच रहा हूँ इस regex का उपयोग करने के लिए (जहां getRidOf चर नाम आप कोशिश कर रहे हैं हो सकता है दूर करने के लिए) और प्रतिस्थापन एक शून्य लंबाई स्ट्रिंग "") है:

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

या शायद

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

जबकि संभवतः नहीं निरपेक्ष जनसंपर्क 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? 

और यह एक साधारण regex है बदल देते हैं:

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&" 

... जो एक एएसपी के लिए मान्य प्रतीत होता है।नेट आवेदन, 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

यहाँ मेरी समाधान है:

I'v कुछ अतिरिक्त इनपुट सत्यापन गयी।

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

हम भी इसे प्रयोग कर सकते हैं regex

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