আমি যেমন একটি স্ট্রিং বিশ্লেষণ করতে চাই p1=6&p2=7&p3=8
একটি মধ্যে NameValueCollection
।
যখন আপনার কাছে Page.Request
অবজেক্টে অ্যাক্সেস নেই তখন এটি করার সর্বাধিক মার্জিত উপায় কী ?
আমি যেমন একটি স্ট্রিং বিশ্লেষণ করতে চাই p1=6&p2=7&p3=8
একটি মধ্যে NameValueCollection
।
যখন আপনার কাছে Page.Request
অবজেক্টে অ্যাক্সেস নেই তখন এটি করার সর্বাধিক মার্জিত উপায় কী ?
উত্তর:
এর জন্য একটি অন্তর্নির্মিত। নেট ইউটিলিটি রয়েছে: এইচটিপিটিউটিলিটি P পার্সিকুয়ের স্ট্রিং
// 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> ইত্যাদি সমর্থন করা প্রয়োজন (এ জাতীয় প্যারামগুলি একাধিক চেকবক্সগুলিকে সমর্থন করার জন্য ব্যবহৃত হতে পারে) ব্যতীত আমার সুপারিশটি হবে এমএস সাইট অনুযায়ী "একই ক্যোরিয় স্ট্রিং ভেরিয়েবলের একাধিক উপস্থিতি এক এন্ট্রিতে একীভূত হয়" দেখুন । পদ্ধতির একটি হ্যান্ডক্র্যাফ্ট সংস্করণ আপনার একমাত্র বিকল্প হতে পারে
এইচটিটিপি ইউটিলিটি.পার্সকিউয়ারি স্ট্রিং ততক্ষণ কাজ করবে যতক্ষণ আপনি কোনও ওয়েব অ্যাপে থাকবেন না বা সিস্টেম.ওয়েবের উপর নির্ভরশীলতা সহ কিছু মনে করবেন না। এটি করার আরেকটি উপায় হ'ল:
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();
সুতরাং আপনি যদি সিস্টেম.ওয়েব নির্ভরতা এড়াতে চান এবং আপনার নিজের রোল করতে না চান তবে এটি একটি ভাল বিকল্প।
আমি সিস্টেমের উপর নির্ভরতা অপসারণ করতে চেয়েছিলাম। ওয়েবে যাতে আমি ক্লিক ক্লাবের ডিপ্লোয়মেন্টের ক্যোরি স্ট্রিংটি পার্স করতে পারি, যখন পূর্বশর্তগুলি কেবল "ক্লায়েন্ট-কেবল ফ্রেমওয়ার্ক সাবসেট" সীমাবদ্ধ।
আমি আরপি এর উত্তর পছন্দ করেছি। আমি কিছু অতিরিক্ত যুক্তি যুক্ত।
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
নিজের লেখা ছাড়া, এবং ছাড়া অতিরিক্ত NuGet প্যাকেজ:
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
আপনি যদি সিস্টেমের উপর নির্ভরতা এড়াতে চান H এইচটিটিপি ইউটিলিটি.পার্সকিউয়ারি স্ট্রিং ব্যবহার করার জন্য ওয়েবটি দরকার হয় তবে আপনি খুঁজে পাওয়া 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"];
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.ParseQueryString
।
https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
যেহেতু প্রত্যেকে তার সমাধানটি পেস্ট করছে বলে মনে হচ্ছে .. এখানে আমার :-) আমার System.Web
স্টোর হাইপারলিঙ্কগুলি থেকে আইডি প্যারামিটারগুলি না নিয়ে ক্লাসের লাইব্রেরির মধ্যে থেকে এই দরকার ছিল ।
ভেবেছিলাম আমি ভাগ করব কারণ আমি এই সমাধানটি আরও দ্রুত এবং আরও ভাল দেখছি find
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")
সমস্ত ক্যোয়ারী স্ট্রিং প্যারামিটারের একটি নামভ্যালু সংগ্রহের জন্য অনুরোধ.কুইয়ারিস্ট্রিং.কিগুলি হিট করুন।
সমস্ত ক্যোয়ারস্ট্রিং মানগুলি পেতে এটি ব্যবহার করে দেখুন:
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;
}
আমি ভিবিতে জোশ-ব্রাউন এর সি # সংস্করণে অনুবাদ করি
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;
}