it-swarm-ko.tech

.NET에서 쿼리 문자열을 NameValueCollection으로 구문 분석하는 방법

p1=6&p2=7&p3=8와 같은 문자열을 NameValueCollection로 구문 분석하고 싶습니다.

Page.Request 개체에 액세스 할 수 없을 때 가장 우아한 방법은 무엇입니까?

181
Nathan Smith

이를위한 내장 .NET 유틸리티가 있습니다 : HttpUtility.ParseQueryString

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

querystringnew Uri(fullUrl).Query으로 바꿔야 할 수도 있습니다.

348
Guy Starbuck

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);
   }
}
43
Scott Dorman

System.Web 에 대한 허용 된 답변의 종속성으로 인해 많은 답변이 사용자 정의 예제를 제공합니다. Microsoft.AspNet.WebApi.Client NuGet 패키지에는 다음과 같이 사용할 수있는 riExtensions.ParseQueryString 메소드가 있습니다.

var uri = new Uri("https://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();

따라서 System.Web 종속성을 피하고 직접 롤링하지 않으려는 경우 좋은 옵션입니다.

25
James Skimming

전제 조건을 "클라이언트 전용 프레임 워크 하위 집합"으로 제한하면서 ClickOnce 배포의 쿼리 문자열을 구문 분석 할 수 있도록 System.Web에 대한 종속성을 제거하려고했습니다.

나는 rp의 대답을 좋아했다. 나는 약간의 논리를 추가했다.

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

OLSC 쿼리로 작업 할 때 이미 제공된 것보다 조금 더 다양한 기능이 필요했습니다.

  • 값은 여러 등호를 포함 할 수 있습니다
  • 이름과 값으로 인코딩 된 문자 디코딩
  • 클라이언트 프레임 워크에서 실행 가능
  • 모바일 프레임 워크에서 실행할 수 있습니다.

내 해결책은 다음과 같습니다.

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

이 기능을 Uri 자체에 추가하기 위해 <Extension()>을 사용하는 것도 좋지 않습니다.

7
Josh Brown

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

7
jvenema

방금 Web API ClientParseQueryString에서 작동하는 Uri 확장 메서드가 있고 HttpValueCollection을 반환한다는 것을 깨달았습니다.

var parameters = uri.ParseQueryString();
string foo = parameters["foo"];
2
Thomas Levesque

HttpUtility.ParseQueryString 을 사용해야하는 System.Web에 대한 종속성을 피하려면 System.Net.Http에있는 Uri 확장 메서드 ParseQueryString을 사용할 수 있습니다. .

프로젝트의 System.Net.Http에 대한 참조 (아직없는 경우)를 추가하십시오.

Uri (System.Net.Http)에서 작동하려면 응답 본문을 유효한 ParseQueryString로 변환해야합니다.

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();
2
Amadeus Sánchez
    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 ] );    
            }    
        }
    }
2
rp.

Request.QueryString에 액세스하십시오. 다른 답변으로 언급 된 AllKeys는 키 배열을 제공합니다.

1
Bloodhound

System.Web 종속성을 원하지 않으면 HttpUtility 클래스에서이 소스 코드를 붙여 넣으십시오.

방금 소스 코드 Mono 에서 이것을 채찍질했습니다. HttpUtility와 모든 종속성 (IHtmlString, Helpers, HttpEncoder, HttpQSCollection)이 포함되어 있습니다.

다음 HttpUtility.ParseQueryString를 사용합니다.

https://Gist.github.com/bjorn-ALi-goransson/b04a7c44808bb2de8cca3fc9a3762f9c

1
user3638471

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
alex1kirch

모두가 자신의 솔루션을 붙여 넣는 것 같습니다. 여기 내 것이 있습니다 :-) 저장된 하이퍼 링크에서 id 매개 변수를 가져 오기 위해 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")
1
Tiele Declercq

모든 쿼리 문자열 매개 변수의 NameValueCollection에 대한 Request.QueryString.Keys를 실행하십시오.

0
Mark Glorie
        var q = Request.QueryString;
        NameValueCollection qscoll = HttpUtility.ParseQueryString(q.ToString());
0
Hamit YILDIRIM

모든 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
0
mirko cro 1234