। নেট এ কীভাবে একটি কোয়েরি স্ট্রিংকে নেমভ্যালু কালেকশনে পার্স করবেন


186

আমি যেমন একটি স্ট্রিং বিশ্লেষণ করতে চাই p1=6&p2=7&p3=8একটি মধ্যে NameValueCollection

যখন আপনার কাছে Page.Requestঅবজেক্টে অ্যাক্সেস নেই তখন এটি করার সর্বাধিক মার্জিত উপায় কী ?

উত্তর:


356

এর জন্য একটি অন্তর্নির্মিত। নেট ইউটিলিটি রয়েছে: এইচটিপিটিউটিলিটি P পার্সিকুয়ের স্ট্রিং

// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)

আপনার querystringসাথে প্রতিস্থাপনের প্রয়োজন হতে পারে new Uri(fullUrl).Query


26
ওমর, এটি এএসপি.এনইটি 4 এ আমার পক্ষে কাজ করেনি, এটি "প্যারা" পরিবর্তে " স্ট্যাকওভারফ্লো ডটকম ? পাড়া" এর একটি চাবি দিয়েছিল । সুতরাং আমি এইচটিপি ইউটিলিটি.পার্সকুইকিস্ট্রিং (নতুন উরি (ফুলআউরএল)। কিউয়ারি) ব্যবহার করছি যা সঠিকভাবে আমার জন্য কাজ করে।
মাইকেল 22

2
qscoll ["পি 1"], কিউএসকোল ["পি 2"] এবং কিউএসকোল ["পি 3"]
এসএমইউসামশাহ

5
ডেস্কটপ অ্যাপ্লিকেশনটিতে পার্সেকুয়েরি স্ট্রিং ব্যবহার করা সত্যিই খারাপ ধারণা, কারণ এটি ক্লায়েন্ট প্রোফাইলে অন্তর্ভুক্ত নয়; ক্লায়েন্ট কম্পিউটারে কেবলমাত্র একটি সাধারণ পদ্ধতি ব্যবহারের জন্য 100 এম অতিরিক্ত গ্রন্থাগার কেন ইনস্টল করবেন? তবে, দেখে মনে হচ্ছে মাইক্রোসফ্টের আরও ভাল ধারণা নেই। একমাত্র উপায় হ'ল নিজস্ব পদ্ধতি প্রয়োগ করা বা ওপেন সোর্স বাস্তবায়ন ব্যবহার করা।
ভিটালি

2
ভাসফটঅনলাইন: সেক্ষেত্রে আপনি পার্সিকুয়ের স্ট্রিংয়ের মনো প্রয়োগ করতে পারেন: github.com/mono/mono/blob/master/mcs/class/System.Web/… এর জন্য লাইসেন্স এমআইটি এক্স 11: github.com/mono/mono / ব্লাব / মাস্টার / লিসেনএসই
স্ব।

3
HttpUtility.ParseQueryStringHttpUtility.ParseQueryString("&X=1&X=2&X=3")ফলাফলের ক্ষেত্রে ....X=1,2,3...একই নামের একাধিক প্যারাম থাকা অস্বাভাবিক তবে কন্ট্রোলার প্যারামিটার যেমন ইনট [], আইনেউবার্য <int> ইত্যাদি সমর্থন করা প্রয়োজন (এ জাতীয় প্যারামগুলি একাধিক চেকবক্সগুলিকে সমর্থন করার জন্য ব্যবহৃত হতে পারে) ব্যতীত আমার সুপারিশটি হবে এমএস সাইট অনুযায়ী "একই ক্যোরিয় স্ট্রিং ভেরিয়েবলের একাধিক উপস্থিতি এক এন্ট্রিতে একীভূত হয়" দেখুন । পদ্ধতির একটি হ্যান্ডক্র্যাফ্ট সংস্করণ আপনার একমাত্র বিকল্প হতে পারে
ডানজাজ

43

এইচটিটিপি ইউটিলিটি.পার্সকিউয়ারি স্ট্রিং ততক্ষণ কাজ করবে যতক্ষণ আপনি কোনও ওয়েব অ্যাপে থাকবেন না বা সিস্টেম.ওয়েবের উপর নির্ভরশীলতা সহ কিছু মনে করবেন না। এটি করার আরেকটি উপায় হ'ল:

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

5
অংশগুলি কল করতে পারেন কিনা তা আপনার পরীক্ষা করা উচিত en দৈর্ঘ্য> 1, আপনি যে অংশগুলি কল করতে পারবেন তা নিশ্চিত করতে [1]
আলেকজান্দ্রু পুপসা

2
যদি কোন মূল্য নেই? যেমন একটি ক্যোয়ারী স্ট্রিংয়ের মতো দেখতে পারে ?foo=1&barHttpUtilityএটিকে পার্স করা হবে{ key = null, value = "bar" }
টমাস লেভেস্ক

এই HttpUtility.ParseQueryString তুলনায় কারণ এটি মান ডিকোড নেই (তাই base64 এনকোড মান সংরক্ষিত হয়) মহান
CRice

1
আসলে, আপনাকে এখনও '=' মানটির অনুমতি দিতে হবে উদাহরণস্বরূপ & কোড = A0SYw34Hj / m ++ lH0s7r0l / yg6GWdymzSCbI2zOn3V4o = এর সর্বশেষ '=' অক্ষর মুছে ফেলা হবে। আমি আপনার কোডের অংশটি আবার লিখলাম '=' এর প্রথম সূচক পেতে এবং কী এবং মানটি সংশোধন করার জন্য (বিভাজনের পরিবর্তে) পরিবর্তিত করতে।
ক্রিস

28

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

সুতরাং আপনি যদি সিস্টেম.ওয়েব নির্ভরতা এড়াতে চান এবং আপনার নিজের রোল করতে না চান তবে এটি একটি ভাল বিকল্প।


3
একই ফাংশনটি সিস্টেম.নেট.এইচটিপি নেমস্পেসে একটি এক্সটেনশন হিসাবে উপস্থিত রয়েছে (নীচে আমার উত্তর দেখুন), অন্য পুরো নির্ভরতার প্রয়োজন নেই ...
জেভেনিমা

@ জেভেনিমা আপনি কোথা থেকে সিস্টেম. নেট.এইচটিটিপি. ফর্ম্যাটিং নির্ভরতা যুক্ত করছেন, আমি বিশ্বাস করি এটি কেবলমাত্র মাইক্রোসফ্ট.এএসপনেট.ওয়েবএপি.স্লিভ নুগেট প্যাকেজ যুক্ত করে সরবরাহ করা হয়েছে।
জেমস স্কিমিং

19

আমি সিস্টেমের উপর নির্ভরতা অপসারণ করতে চেয়েছিলাম। ওয়েবে যাতে আমি ক্লিক ক্লাবের ডিপ্লোয়মেন্টের ক্যোরি স্ট্রিংটি পার্স করতে পারি, যখন পূর্বশর্তগুলি কেবল "ক্লায়েন্ট-কেবল ফ্রেমওয়ার্ক সাবসেট" সীমাবদ্ধ।

আমি আরপি এর উত্তর পছন্দ করেছি। আমি কিছু অতিরিক্ত যুক্তি যুক্ত।

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

উইন্ডোজ ফোনের জন্য এটি সত্যই সহায়ক, আপনি কেবলমাত্র "নেমভ্যালিউ কালেকশন" প্রতিস্থাপন করতে হবে একটি "সাজানো ডিকশনারি <স্ট্রিং>"
মাইক ব্রায়ান্ট

4
অভিধানের জন্য নামভ্যালু সংগ্রহটি স্যুইচ করার সময় সতর্ক থাকুন - সেগুলি একই নয়! ক্যোরি স্ট্রিংগুলি একই মান সহ একাধিক কী সমর্থন করে এবং নেমভ্যালু কালেকশনটিও তাই করে।
ম্যাট ডেক্রে

7

আমার একটি ফাংশন দরকার যা ওএলএসসি প্রশ্নের সাথে কাজ করার সময় ইতিমধ্যে সরবরাহ করা চেয়ে কিছুটা বহুমুখী।

  • মানগুলিতে একাধিক সমান চিহ্ন থাকতে পারে
  • নাম এবং মান উভয় ক্ষেত্রে এনকোড করা অক্ষরগুলি ডিকোড করুন
  • ক্লায়েন্ট ফ্রেমওয়ার্ক চলমান সক্ষম
  • মোবাইল ফ্রেমওয়ার্কে চলমান সক্ষম।

এখানে আমার সমাধান:

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()>নিজেও উরির সক্ষমতা যুক্ত করার জন্য এটি ব্যবহার করা খারাপ ধারণা নাও হতে পারে ।


7

ছাড়া এই কাজের জন্য System.Webনিজের লেখা ছাড়া, এবং ছাড়া অতিরিক্ত NuGet প্যাকেজ:

  1. একটি রেফারেন্স যোগ করুন System.Net.Http.Formatting
  2. যোগ using System.Net.Http;
  3. এই কোডটি ব্যবহার করুন:

    new Uri(uri).ParseQueryString()

https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs.118).aspx


3
আপনি কোথা থেকে সিস্টেম. নেট.এইচটিটিপি. ফর্ম্যাটিং নির্ভরতা যুক্ত করছেন, আমি বিশ্বাস করি এটি কেবলমাত্র মাইক্রোসফ্ট.এএসপনেট.ওয়েবএপিআই.ক্লায়েন্ট নিউগেট প্যাকেজ যুক্ত করে সরবরাহ করা হয়েছে।
জেমস স্কিমিং

হু, আমার খারাপ। আমার ধারণা এটি স্বয়ংক্রিয়ভাবে ইনস্টল হওয়া এমভিসি ফ্রেমওয়ার্কের সাথে এসেছিল, সুতরাং আমাকে কোনও অ্যাড'ল প্যাকেজ (প্রোগ্রাম ফাইল (x86) \ মাইক্রোসফ্ট এএসপি.নেট \ এএসপি.নেট এমভিসি 4 \ অ্যাসেমব্লিজ \ সিস্টেম.নেট যুক্ত করতে হয়নি। এইচটিপি। ফরম্যাটিং.ডিল)
জুনে

System.Net. Formatting EXTENSION VS2019 traditionalতিহ্যবাহী কাঠামোর রেফারেন্স থেকে আলাদা তালিকা বা ট্যাব
স্কেল সার্ফার

3

আপনি যদি সিস্টেমের উপর নির্ভরতা এড়াতে চান H এইচটিটিপি ইউটিলিটি.পার্সকিউয়ারি স্ট্রিং ব্যবহার করার জন্য ওয়েবটি দরকার হয় তবে আপনি খুঁজে পাওয়া Uriএক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন ।ParseQueryStringSystem.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();

System.Net. ফরমেটিং এক্সটেনশন ভিএস2019 এক্সটেনশন রেফারেন্সগুলিকে প্রচলিত কাঠামোর রেফারেন্স থেকে পৃথক করে।
SQL সার্ফার

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

5
সেমিকোলনকে এইচপি তে প্যারামিটার বিভাজক হিসাবেও অনুমোদিত, চাকাটি পুনর্বিবেচনা না করাই ভাল
ম্যাথু লক


1

কেবলমাত্র অনুরোধ.কুইস্ট্রিস্টিং অ্যাক্সেস করুন। অন্য উত্তর হিসাবে উল্লিখিত অলকিস আপনাকে কীগুলির একটি অ্যারে দেয়।


1

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

1

আপনি যদি System.Web নির্ভরতা না চান, কেবল এই উত্স কোডটি এইচটিটিপি ইউটিলিটি ক্লাস থেকে আটকান।

আমি শুধু সোর্স কোড থেকে এই একসঙ্গে বেত্রাঘাত মনো । এটিতে এইচটিপিটিউটিলিটি এবং এর সমস্ত নির্ভরতা রয়েছে (যেমন আইএইচটিএমটিস স্ট্রিং, হেল্পার্স, এইচটিপিএইঙ্কোডার, এইচটিপিকিউএসক্লিকেশন)।

তারপরে ব্যবহার করুন HttpUtility.ParseQueryString

https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c


1

যেহেতু প্রত্যেকে তার সমাধানটি পেস্ট করছে বলে মনে হচ্ছে .. এখানে আমার :-) আমার 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")

1
এই পদ্ধতিতে কেবল একটি সমস্যা: প্রদত্ত প্যারামিটারের জন্য ক্যোয়ারী স্ট্রিংয়ের একাধিক মান থাকতে পারে। এই ক্ষেত্রে, আপনার পদ্ধতিটি একটি সদৃশ কী ত্রুটি নিক্ষেপ করবে।
টমাস লেভেস্ক

হ্যাঁ, কমপক্ষে একটি নেমভ্যালু কালেকশন ব্যবহার করুন, নকল কী সহ ক্যোরিস্ট্রিংগুলি পুরোপুরি আইনী।
চাদ গ্রান্ট

এছাড়াও, আপনার অভিধানটি কেস সংবেদনশীল, তাই এক্স = 1 এবং এক্স = 1 বিভিন্ন কী হবে। নতুন অভিধান প্রয়োজন <স্ট্রিং, স্ট্রিং> (স্ট্রিংকম্পিয়ার.অর্ডিনালআইগনোর কেস);
চাদ গ্রান্ট

0

সমস্ত ক্যোয়ারী স্ট্রিং প্যারামিটারের একটি নামভ্যালু সংগ্রহের জন্য অনুরোধ.কুইয়ারিস্ট্রিং.কিগুলি হিট করুন।


0

সমস্ত ক্যোয়ারস্ট্রিং মানগুলি পেতে এটি ব্যবহার করে দেখুন:

    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


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

-1

আমি ভিবিতে জোশ-ব্রাউন এর সি # সংস্করণে অনুবাদ করি

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

-2

এটি আমার কোড, আমি এটি খুব দরকারী বলে মনে করি:

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.