.NET এ স্ট্রিং থেকে url পরামিতি পান


239

আমি .NET এ স্ট্রিং পেয়েছি যা আসলে একটি ইউআরএল। আমি একটি নির্দিষ্ট পরামিতি থেকে মান পেতে একটি সহজ উপায় চাই।

সাধারণত, আমি কেবল ব্যবহার করব Request.Params["theThingIWant"], তবে এই স্ট্রিংটি অনুরোধটি থেকে নয়। আমি এর Uriমতো একটি নতুন আইটেম তৈরি করতে পারি :

Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);

আমি myUri.Queryক্যোরিয় স্ট্রিং পেতে ব্যবহার করতে পারি ... তবে তারপরে স্পষ্টতই আমি এটি বিভক্ত করার কোনও রেজিওকী উপায় খুঁজে পেতে হবে।

আমি কি স্পষ্ট কিছু অনুভব করছি, বা কোনও প্রকারের রেজেক্স তৈরির সংক্ষিপ্তকরণটি করার কোনও উপায় নেই?

উত্তর:


494

স্ট্যাটিক ব্যবহার করুন ParseQueryStringপদ্ধতি System.Web.HttpUtilityবর্গ যে আয় NameValueCollection

Uri myUri = new Uri("http://www.example.com?param1=good&param2=bad");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");

Http://msdn.microsoft.com/en-us/library/ms150046.aspx এ ডকুমেন্টেশন চেক করুন


14
এটি প্রথম প্যারামিটারটি সনাক্ত করে বলে মনে হচ্ছে না। উদাহরণস্বরূপ " google.com/… " পার্সিং করা প্যারামিটার Q সনাক্ত করে না
অ্যান্ড্রু শেফার্ড

@ অ্যান্ড্রু আমি নিশ্চিত। এটি আজব (বাগ?) আপনি এখনও তবুও ব্যবহার করুন HttpUtility.ParseQueryString(myUri.Query).Get(0)এবং এটি প্রথম প্যারামিটারটি বের করবে। `
মারিউজ পাভেলস্কি

একটি প্যারামিটারাইজড কোয়েরি ইউআরএল তৈরির জন্য কোনও নেট নেটওয়ার্ক?
শিমি ওয়েটজ্যান্ডলার

6
আপনি এর সাথে পুরো ক্যোয়ারী URL গুলো পার্স করতে পারবেন না HttpUtility.ParseQueryString(string)! যেমন নামটি বলেছে, এটি ক্যোয়ারী প্যারামিটারগুলির URL নয়, কোয়েরি স্ট্রিংগুলি পার্স করা। আপনি এটা করতে চান, তাহলে আপনাকে প্রথমে এটি অনুসারে বিভক্ত নয় ?এই মত: Url.Split('?')এবং শেষ উপাদান ব্যবহার (পরিস্থিতির উপর নির্ভর করে এবং আপনি কি হবে) [0]বা LINQ এর Last()/ LastOrDefault()
কোসিয়েক

1
যখন নিজেকে এই trialling, স্বাক্ষর এই পরিবর্তিত হয়েছে বলে মনে হচ্ছে: HttpUtility.ParseQueryString (uri.Query) .GetValues ( "PARAM1") প্রথম ()।
দ্য সিনেটর


34

এখানে অন্য বিকল্প রয়েছে যদি কোনও কারণে আপনি ব্যবহার করতে না পারেন বা না চান HttpUtility.ParseQueryString()

এটি "ত্রুটিযুক্ত" ক্যোয়ারী স্ট্রিংগুলির প্রতি কিছুটা সহনশীল হওয়ার জন্য নির্মিত, অর্থাত http://test/test.html?empty=খালি মান সহ একটি প্যারামিটার হয়ে যায়। কলার প্রয়োজনে প্যারামিটারগুলি যাচাই করতে পারে।

public static class UriHelper
{
    public static Dictionary<string, string> DecodeQueryParameters(this Uri uri)
    {
        if (uri == null)
            throw new ArgumentNullException("uri");

        if (uri.Query.Length == 0)
            return new Dictionary<string, string>();

        return uri.Query.TrimStart('?')
                        .Split(new[] { '&', ';' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(parameter => parameter.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries))
                        .GroupBy(parts => parts[0],
                                 parts => parts.Length > 2 ? string.Join("=", parts, 1, parts.Length - 1) : (parts.Length > 1 ? parts[1] : ""))
                        .ToDictionary(grouping => grouping.Key,
                                      grouping => string.Join(",", grouping));
    }
}

পরীক্ষা

[TestClass]
public class UriHelperTest
{
    [TestMethod]
    public void DecodeQueryParameters()
    {
        DecodeQueryParametersTest("http://test/test.html", new Dictionary<string, string>());
        DecodeQueryParametersTest("http://test/test.html?", new Dictionary<string, string>());
        DecodeQueryParametersTest("http://test/test.html?key=bla/blub.xml", new Dictionary<string, string> { { "key", "bla/blub.xml" } });
        DecodeQueryParametersTest("http://test/test.html?eins=1&zwei=2", new Dictionary<string, string> { { "eins", "1" }, { "zwei", "2" } });
        DecodeQueryParametersTest("http://test/test.html?empty", new Dictionary<string, string> { { "empty", "" } });
        DecodeQueryParametersTest("http://test/test.html?empty=", new Dictionary<string, string> { { "empty", "" } });
        DecodeQueryParametersTest("http://test/test.html?key=1&", new Dictionary<string, string> { { "key", "1" } });
        DecodeQueryParametersTest("http://test/test.html?key=value?&b=c", new Dictionary<string, string> { { "key", "value?" }, { "b", "c" } });
        DecodeQueryParametersTest("http://test/test.html?key=value=what", new Dictionary<string, string> { { "key", "value=what" } });
        DecodeQueryParametersTest("http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1%22",
            new Dictionary<string, string>
            {
                { "q", "energy+edge" },
                { "rls", "com.microsoft:en-au" },
                { "ie", "UTF-8" },
                { "oe", "UTF-8" },
                { "startIndex", "" },
                { "startPage", "1%22" },
            });
        DecodeQueryParametersTest("http://test/test.html?key=value;key=anotherValue", new Dictionary<string, string> { { "key", "value,anotherValue" } });
    }

    private static void DecodeQueryParametersTest(string uri, Dictionary<string, string> expected)
    {
        Dictionary<string, string> parameters = new Uri(uri).DecodeQueryParameters();
        Assert.AreEqual(expected.Count, parameters.Count, "Wrong parameter count. Uri: {0}", uri);
        foreach (var key in expected.Keys)
        {
            Assert.IsTrue(parameters.ContainsKey(key), "Missing parameter key {0}. Uri: {1}", key, uri);
            Assert.AreEqual(expected[key], parameters[key], "Wrong parameter value for {0}. Uri: {1}", parameters[key], uri);
        }
    }
}

জামারিন প্রকল্পের জন্য সহায়ক, যেখানে এইচটিপি ইউটিলিটি অনুপলব্ধ রয়েছে
আর্টিসিয়াস

12

@ অ্যান্ড্রু এবং @ সিজেডফক্স

আমার একই ত্রুটি ছিল এবং কারণটি প্যারামিটারটি হ'ল আসলে: http://www.example.com?param1এবং নাparam1 যা প্রত্যাশা করবে তা নয়।

সমস্ত চিহ্ন অক্ষর পূর্বে এবং প্রশ্ন চিহ্ন সহ এই সমস্যার সমাধান করে। সুতরাং সংক্ষেপে HttpUtility.ParseQueryStringফাংশনটির জন্য কেবল প্রশ্ন চিহ্নের পরে কেবল অক্ষর সম্বলিত একটি বৈধ ক্যোয়ারী স্ট্রিং প্যারামিটার প্রয়োজন:

HttpUtility.ParseQueryString ( "param1=good&param2=bad" )

আমার কার্যনির্বাহী:

string RawUrl = "http://www.example.com?param1=good&param2=bad";
int index = RawUrl.IndexOf ( "?" );
if ( index > 0 )
    RawUrl = RawUrl.Substring ( index ).Remove ( 0, 1 );

Uri myUri = new Uri( RawUrl, UriKind.RelativeOrAbsolute);
string param1 = HttpUtility.ParseQueryString( myUri.Query ).Get( "param1" );`

যখন ইউআরআই তাত্ক্ষণিক হয় তখন আমি ত্রুটিটি পাই "অবৈধ ইউআরআই: ইউআরআই এর ফর্ম্যাটটি নির্ধারণ করা যায়নি।" আমি মনে করি না যে এই সমাধানটি উদ্দেশ্য হিসাবে কাজ করে।
পল ম্যাথিউজ

@ পলম্যাথিউস, আপনি সঠিক আছেন এই প্রদত্ত সমাধানের সময়, আমি পুরানো। নেট ফ্রেমওয়ার্ক 2.0 ব্যবহার করছিলাম। নিশ্চিত করার জন্য, আপনার বক্তব্যটি, আমি জোসেফ আলবাহার দ্বারা এই সমাধানটি লিনকিপ্যাড ভি 2-তে অনুলিপি করে আটকিয়েছি এবং আপনার উল্লিখিত একই ত্রুটি পেয়েছি।
মো গউভিন

@ পলম্যাথিউস, ঠিক করতে, লাইনটি উরি মাইআউরি = নতুন উরি (RawUrl) পড়ার জন্য সরিয়ে ফেলুন; এবং কেবলমাত্র নিখুঁতভাবে শেষ বিবৃতিতে RawUrl পাস করুন: স্ট্রিং প্যারাম 1 = HttpUटिल.ParseQueryString (RawUrl) .Get ("param2");
মো গউভিন

হ্যাঁ, এটি কেবল ক্যোয়ারী স্ট্রিং অংশটিকে বিশ্লেষণ করে নাম এবং ডকুমেন্টেশনে। এটি কোনও বাগ নয়। আমি কীভাবে এটিকে আরও পরিষ্কার করে তুলতে পারি তাও নিশ্চিত নই। ParseQueryStringকোয়েরি স্ট্রিংকে পার্স করে।
পান্ডাওয়ুড

12

দেখে মনে হচ্ছে আপনার মানগুলি লুপ করা উচিত myUri.Queryএবং সেখান থেকে পার্স করা উচিত।

 string desiredValue;
 foreach(string item in myUri.Query.Split('&'))
 {
     string[] parts = item.Replace("?", "").Split('=');
     if(parts[0] == "desiredKey")
     {
         desiredValue = parts[1];
         break;
     }
 }

আমি এই কোডটি ত্রুটিযুক্ত ইউআরএলগুলির গুচ্ছ যদিও পরীক্ষা না করে ব্যবহার করব না। এটি কিছু / এগুলি ভেঙে যেতে পারে:

  • hello.html?
  • hello.html?valuelesskey
  • hello.html?key=value=hi
  • hello.html?hi=value?&b=c
  • ইত্যাদি

4

এটির জন্য প্রথম প্যারামিটারের সাথে কাজ করার জন্য আপনি নীচের কাজটি ব্যবহার করতে পারেন:

var param1 =
    HttpUtility.ParseQueryString(url.Substring(
        new []{0, url.IndexOf('?')}.Max()
    )).Get("param1");

2

এর FillFromStringপদ্ধতিটি দেখতে .NET প্রতিচ্ছবি ব্যবহার করুন System.Web.HttpValueCollection। এটি আপনাকে এএসপি.এনইটি Request.QueryStringসংগ্রহটি পূরণের জন্য যে কোডটি ব্যবহার করছে তা দেয় ।


1

অথবা আপনি যদি ইউআরএলটি জানেন না (যাতে হার্ডকোডিং এড়ানোর জন্য, ব্যবহার করুন AbsoluteUri

উদাহরণ ...

        //get the full URL
        Uri myUri = new Uri(Request.Url.AbsoluteUri);
        //get any parameters
        string strStatus = HttpUtility.ParseQueryString(myUri.Query).Get("status");
        string strMsg = HttpUtility.ParseQueryString(myUri.Query).Get("message");
        switch (strStatus.ToUpper())
        {
            case "OK":
                webMessageBox.Show("EMAILS SENT!");
                break;
            case "ER":
                webMessageBox.Show("EMAILS SENT, BUT ... " + strMsg);
                break;
        }

0

যদি আপনি ডিফল্ট পৃষ্ঠায় আপনার ক্যুরি স্ট্রিং পেতে চান ef ডিফল্ট পৃষ্ঠাটির অর্থ আপনার বর্তমান পৃষ্ঠার url। আপনি এই কোড চেষ্টা করতে পারেন:

string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");

0

এটি আসলে খুব সহজ, এবং এটি আমার পক্ষে কাজ করেছে :)

        if (id == "DK")
        {
            string longurl = "selectServer.aspx?country=";
            var uriBuilder = new UriBuilder(longurl);
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
            query["country"] = "DK";

            uriBuilder.Query = query.ToString();
            longurl = uriBuilder.ToString();
        } 

0

যে কেউ স্ট্রিং থেকে সমস্ত ক্যোয়ারী স্ট্রিংয়ের মধ্য দিয়ে লুপ করতে চায় For

        foreach (var item in new Uri(urlString).Query.TrimStart('?').Split('&'))
        {
            var subStrings = item.Split('=');

            var key = subStrings[0];
            var value = subStrings[1];

            // do something with values
        }


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