답변:
이를위한 내장 .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> 등과 같은 컨트롤러 매개 변수를 지원하는 데 필요한 경우를 제외하고는 내 권장 사항입니다 (이러한 매개 변수는 여러 확인란을 지원하는 데 사용될 수 있음) MS 사이트에 따라 "동일한 쿼리 문자열 변수의 여러 항목이 하나의 항목으로 통합됨"을 참조 하십시오 . 이 방법의 수제 버전은 유일한 옵션 일 수 있습니다
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 종속성 을 피하고 직접 롤링하지 않으려는 경우 좋은 옵션입니다.
전제 조건을 "클라이언트 전용 프레임 워크 하위 집합"으로 제한하면서 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;
}
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
<Extension()>
Uri 자체에 기능을 추가하기 위해 그 문제 를 다루는 것은 나쁜 생각이 아닙니다 .
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
HttpUtility.ParseQueryString 을 사용해야하는 System.Web에 대한 종속성을 피하려면에서 찾은 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 ] );
}
}
}
방금 Web API Client 에 a ParseQueryString
에서 작동하고 a 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);
방금 Mono 소스 코드에서 이것을 채찍질했습니다 . HttpUtility와 모든 종속성 (IHtmlString, Helpers, HttpEncoder, HttpQSCollection)이 포함되어 있습니다.
그런 다음을 사용하십시오 HttpUtility.ParseQueryString
.
https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
모두가 자신의 솔루션을 붙여 넣는 것 같습니다. 여기 내 것이 있습니다 :-) System.Web
저장된 하이퍼 링크에서 id 매개 변수를 가져 오지 않고 클래스 라이브러리에서 이것을 필요로했습니다 .
이 솔루션이 더 빠르고 더 좋아 보이기 때문에 공유하고 싶다고 생각했습니다.
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")
모든 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
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;
}