मैं एक स्ट्रिंग को पार्स करना चाहूंगा जैसे कि p1=6&p2=7&p3=8
ए NameValueCollection
।
जब आपके पास Page.Request
ऑब्जेक्ट तक पहुंच नहीं है, तो ऐसा करने का सबसे सुरुचिपूर्ण तरीका क्या है ?
मैं एक स्ट्रिंग को पार्स करना चाहूंगा जैसे कि p1=6&p2=7&p3=8
ए NameValueCollection
।
जब आपके पास Page.Request
ऑब्जेक्ट तक पहुंच नहीं है, तो ऐसा करने का सबसे सुरुचिपूर्ण तरीका क्या है ?
जवाबों:
इसके लिए एक अंतर्निहित .NET उपयोगिता है: HttpUtility.ParseQueryString
// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)
आप बदलना पड़ सकता है querystring
के साथ new Uri(fullUrl).Query
।
HttpUtility.ParseQueryString
सिवाय इसके कि मेरी सिफारिश होगी कि HttpUtility.ParseQueryString("&X=1&X=2&X=3")
परिणाम के मामले में एक ....X=1,2,3...
ही नाम के कई सारे परिमाण असामान्य हैं, लेकिन कंट्रोलर मापदंडों जैसे int [], IEnumerable <int> आदि का समर्थन करने की आवश्यकता है (ऐसे params का उपयोग कई मल्टीबॉक्स के लिए किया जा सकता है) एमएस साइट के अनुसार "एक ही क्वेरी स्ट्रिंग वेरिएबल के कई आवृत्तियों को एक प्रविष्टि में समेकित किया जाता है" देखें । विधि का एक दस्तकारी संस्करण आपका एकमात्र विकल्प हो सकता है
HttpUtility.ParseQueryString जब तक आप एक वेब ऐप में हैं या System.Web पर निर्भरता सहित कोई बुरा काम नहीं करेंगे। ऐसा करने का एक और तरीका है:
NameValueCollection queryParameters = new NameValueCollection();
string[] querySegments = queryString.Split('&');
foreach(string segment in querySegments)
{
string[] parts = segment.Split('=');
if (parts.Length > 0)
{
string key = parts[0].Trim(new char[] { '?', ' ' });
string val = parts[1].Trim();
queryParameters.Add(key, val);
}
}
?foo=1&bar
। HttpUtility
इसे पार्स करेंगे{ key = null, value = "bar" }
System.Web पर स्वीकृत उत्तर की निर्भरता के कारण बहुत सारे उत्तर कस्टम उदाहरण प्रदान कर रहे हैं । से Microsoft.AspNet.WebApi.Client NuGet पैकेज एक है UriExtensions.ParseQueryString विधि का भी इस्तेमाल किया जा सकता है:
var uri = new Uri("https://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();
इसलिए यदि आप System.Web निर्भरता से बचना चाहते हैं और अपना रोल नहीं करना चाहते हैं, तो यह एक अच्छा विकल्प है।
मैं System.Web पर निर्भरता को दूर करना चाहता था, ताकि "क्लाइंट-ओनली फ्रेमवर्क सबसेट" तक सीमित पूर्वापेक्षाएँ होने पर, मैं एक ClickOnce परिनियोजन के क्वेरी स्ट्रिंग को पार्स कर सकूं।
मुझे आरपी का जवाब पसंद आया। मैंने कुछ अतिरिक्त तर्क जोड़े।
public static NameValueCollection ParseQueryString(string s)
{
NameValueCollection nvc = new NameValueCollection();
// remove anything other than query string from url
if(s.Contains("?"))
{
s = s.Substring(s.IndexOf('?') + 1);
}
foreach (string vp in Regex.Split(s, "&"))
{
string[] singlePair = Regex.Split(vp, "=");
if (singlePair.Length == 2)
{
nvc.Add(singlePair[0], singlePair[1]);
}
else
{
// only one key with no value specified in query string
nvc.Add(singlePair[0], string.Empty);
}
}
return nvc;
}
मुझे एक ऐसे फ़ंक्शन की आवश्यकता थी, जो ओएलएससी प्रश्नों के साथ काम करते समय पहले से उपलब्ध कराए गए से थोड़ा अधिक बहुमुखी हो।
यहाँ मेरा समाधान है:
Public Shared Function ParseQueryString(ByVal uri As Uri) As System.Collections.Specialized.NameValueCollection
Dim result = New System.Collections.Specialized.NameValueCollection(4)
Dim query = uri.Query
If Not String.IsNullOrEmpty(query) Then
Dim pairs = query.Substring(1).Split("&"c)
For Each pair In pairs
Dim parts = pair.Split({"="c}, 2)
Dim name = System.Uri.UnescapeDataString(parts(0))
Dim value = If(parts.Length = 1, String.Empty,
System.Uri.UnescapeDataString(parts(1)))
result.Add(name, value)
Next
End If
Return result
End Function
हो सकता है <Extension()>
कि उरी में अपनी क्षमता को जोड़ने के लिए इससे निपटना भी बुरा न हो ।
इसे बिना System.Web
, स्वयं लिखे बिना, और अतिरिक्त नुगेट पैकेज के बिना करने के लिए:
System.Net.Http.Formatting
using System.Net.Http;
इस कोड का उपयोग करें:
new Uri(uri).ParseQueryString()
https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs.118).aspx
आप System.Web पर निर्भरता है कि उपयोग करने के लिए आवश्यक है से बचना चाहते हैं HttpUtility.ParseQueryString , आप इस्तेमाल कर सकते हैं Uri
विस्तार विधि ParseQueryString
में पाया System.Net.Http
।
System.Net.Http
अपनी परियोजना में एक संदर्भ (यदि आप पहले से ही नहीं है) जोड़ना सुनिश्चित करें ।
ध्यान दें कि आपको प्रतिक्रिया निकाय को मान्य में बदलना है Uri
ताकि ParseQueryString
(में System.Net.Http
) काम करे।
string body = "value1=randomvalue1&value2=randomValue2";
// "http://localhost/query?" is added to the string "body" in order to create a valid Uri.
string urlBody = "http://localhost/query?" + body;
NameValueCollection coll = new Uri(urlBody).ParseQueryString();
private void button1_Click( object sender, EventArgs e )
{
string s = @"p1=6&p2=7&p3=8";
NameValueCollection nvc = new NameValueCollection();
foreach ( string vp in Regex.Split( s, "&" ) )
{
string[] singlePair = Regex.Split( vp, "=" );
if ( singlePair.Length == 2 )
{
nvc.Add( singlePair[ 0 ], singlePair[ 1 ] );
}
}
}
मुझे बस एहसास हुआ कि वेब एपीआई क्लाइंट के पास एक ParseQueryString
एक्सटेंशन तरीका है जो एक पर काम करता है Uri
और एक रिटर्न देता है HttpValueCollection
:
var parameters = uri.ParseQueryString();
string foo = parameters["foo"];
बस Request.QueryString का उपयोग करें। AllKeys को एक अन्य उत्तर के रूप में उल्लेख किया गया है जिसमें आपको कुंजियों की एक सरणी मिलती है।
HttpUtility.ParseQueryString(Request.Url.Query)
वापसी HttpValueCollection
(आंतरिक वर्ग) है। इससे विरासत में मिला है NameValueCollection
।
var qs = HttpUtility.ParseQueryString(Request.Url.Query);
qs.Remove("foo");
string url = "~/Default.aspx";
if (qs.Count > 0)
url = url + "?" + qs.ToString();
Response.Redirect(url);
मैं सिर्फ मोनो के स्रोत कोड से इसे एक साथ मार दिया । इसमें HttpUtility और यह सब निर्भरताएं हैं (जैसे कि IHtmlString, Helpers, HttpEncoder, HttpQSCollection)।
फिर उपयोग करें HttpUtility.ParseQueryString
।
https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
चूँकि हर कोई उसका समाधान चिपका रहा है। यहाँ मेरा खान :-) मुझे System.Web
स्टोर किए गए हाइपरलिंक से आईडी मापदंडों को लाने के बिना एक वर्ग पुस्तकालय के भीतर से इसकी आवश्यकता थी ।
सोचा था कि मैं साझा करूंगा क्योंकि मुझे यह समाधान तेजी से और बेहतर लग रहा है।
public static class Statics
public static Dictionary<string, string> QueryParse(string url)
{
Dictionary<string, string> qDict = new Dictionary<string, string>();
foreach (string qPair in url.Substring(url.IndexOf('?') + 1).Split('&'))
{
string[] qVal = qPair.Split('=');
qDict.Add(qVal[0], Uri.UnescapeDataString(qVal[1]));
}
return qDict;
}
public static string QueryGet(string url, string param)
{
var qDict = QueryParse(url);
return qDict[param];
}
}
उपयोग:
Statics.QueryGet(url, "id")
सभी क्वेरी स्ट्रिंग मापदंडों के NameValueCollection के लिए Request.QueryString.Keys को हिट करें।
सभी Querystring मान प्राप्त करने के लिए यह प्रयास करें:
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)
Dim sb As New StringBuilder("<br />")
For Each s As String In qscoll.AllKeys
Response.Write(s & " - " & qscoll(s) & "<br />")
Next s
var q = Request.QueryString;
NameValueCollection qscoll = HttpUtility.ParseQueryString(q.ToString());
let search = window.location.search;
console.log(search);
let qString = search.substring(1);
while(qString.indexOf("+") !== -1)
qString = qString.replace("+", "");
let qArray = qString.split("&");
let values = [];
for(let i = 0; i < qArray.length; i++){
let pos = qArray[i].search("=");
let keyVal = qArray[i].substring(0, pos);
let dataVal = qArray[i].substring(pos + 1);
dataVal = decodeURIComponent(dataVal);
values[keyVal] = dataVal;
}
मैं VB में josh-brown के C # संस्करण में अनुवाद करता हूं
private System.Collections.Specialized.NameValueCollection ParseQueryString(Uri uri)
{
var result = new System.Collections.Specialized.NameValueCollection(4);
var query = uri.Query;
if (!String.IsNullOrEmpty(query))
{
var pairs = query.Substring(1).Split("&".ToCharArray());
foreach (var pair in pairs)
{
var parts = pair.Split("=".ToCharArray(), 2);
var name = System.Uri.UnescapeDataString(parts[0]);
var value = (parts.Length == 1) ? String.Empty : System.Uri.UnescapeDataString(parts[1]);
result.Add(name, value);
}
}
return result;
}
यह मेरा कोड है, मुझे लगता है कि यह बहुत उपयोगी है:
public String GetQueryString(string ItemToRemoveOrInsert = null, string InsertValue = null )
{
System.Collections.Specialized.NameValueCollection filtered = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (ItemToRemoveOrInsert != null)
{
filtered.Remove(ItemToRemoveOrInsert);
if (!string.IsNullOrWhiteSpace(InsertValue))
{
filtered.Add(ItemToRemoveOrInsert, InsertValue);
}
}
string StrQr = string.Join("&", filtered.AllKeys.Select(key => key + "=" + filtered[key]).ToArray());
if (!string.IsNullOrWhiteSpace(StrQr)){
StrQr="?" + StrQr;
}
return StrQr;
}