.NET에는 실제로 URL 인 문자열이 있습니다. 특정 매개 변수에서 값을 얻는 쉬운 방법을 원합니다.
일반적으로을 사용 Request.Params["theThingIWant"]
하지만이 문자열은 요청에서 온 것이 아닙니다. 다음 Uri
과 같이 새 항목을 만들 수 있습니다 .
Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);
myUri.Query
쿼리 문자열을 얻는 데 사용할 수 있지만 … 분명한 정규식 방법을 찾아야합니다.
나는 명백한 것을 놓치고 있습니까, 아니면 어떤 종류의 정규 표현식을 만드는 짧은 방법을 수행 할 수있는 방법이 있습니까?
답변
을 반환 ParseQueryString
하는 System.Web.HttpUtility
클래스의 정적 메서드를 사용하십시오 NameValueCollection
.
Uri myUri = new Uri("http://www.example.com?param1=good¶m2=bad");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");
http://msdn.microsoft.com/en-us/library/ms150046.aspx 에서 설명서를 확인하십시오 .
답변
이것은 아마도 당신이 원하는 것입니다
var uri = new Uri("http://domain.test/Default.aspx?var1=true&var2=test&var3=3");
var query = HttpUtility.ParseQueryString(uri.Query);
var var2 = query.Get("var2");
답변
어떤 이유로 든을 사용할 수 없거나 사용하지 않으려는 경우 다른 대안이 있습니다 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);
}
}
}
답변
@Andrew와 @CZFox
: 나는 같은 버그를했다 및 매개 변수 하나가 사실이라고 할 원인을 발견 http://www.example.com?param1
하지 param1
사람이 무엇을 기대이다.
물음표 앞뒤에있는 모든 문자를 제거하면이 문제가 해결됩니다. 따라서 본질적으로 HttpUtility.ParseQueryString
함수에는 물음표 뒤에 문자 만 포함하는 유효한 쿼리 문자열 매개 변수 만 필요합니다.
HttpUtility.ParseQueryString ( "param1=good¶m2=bad" )
내 해결 방법 :
string RawUrl = "http://www.example.com?param1=good¶m2=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" );`
답변
값을 반복 myUri.Query
하여 구문 분석 해야하는 것처럼 보입니다 .
string desiredValue;
foreach(string item in myUri.Query.Split('&'))
{
string[] parts = item.Replace("?", "").Split('=');
if(parts[0] == "desiredKey")
{
desiredValue = parts[1];
break;
}
}
그러나 잘못된 형식의 URL에서 테스트하지 않으면이 코드를 사용하지 않습니다. 다음 중 일부 / 모든 부분이 깨질 수 있습니다.
hello.html?
hello.html?valuelesskey
hello.html?key=value=hi
hello.html?hi=value?&b=c
- 기타
답변
첫 번째 매개 변수에 대해서도 다음 해결 방법을 사용할 수 있습니다.
var param1 =
HttpUtility.ParseQueryString(url.Substring(
new []{0, url.IndexOf('?')}.Max()
)).Get("param1");
답변
.NET 리플렉터를 사용하여의 FillFromString
방법 을 봅니다 System.Web.HttpValueCollection
. 그러면 ASP.NET이 Request.QueryString
컬렉션 을 채우는 데 사용하는 코드가 제공 됩니다.