수색…


비고

디코드 URL 예제에서 사용 된 정규 표현식은 RFC 2396, 부록 B : 정규 표현식을 사용한 URI 참조 구문 분석 에서 가져 왔습니다. 후손을 위해 여기에 인용구가 있습니다.

다음 행은 URI 참조를 해당 구성 요소로 세분화하는 정규 표현식입니다.

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 12            3  4          5       6  7        8 9

위의 두 번째 줄에있는 숫자는 가독성을 높이기위한 것입니다. 그들은 각 부 표현식에 대한 참조 점을 나타냅니다 (즉, 각 쌍을 이루는 괄호). 서브 표현식에 매치 된 값을 $로 참조합니다. 예를 들어 위의 표현식을

http://www.ics.uci.edu/pub/ietf/uri/#Related

결과는 다음과 같은 하위 표현식과 일치합니다.

$1 = http:
$2 = http
$3 = //www.ics.uci.edu
$4 = www.ics.uci.edu
$5 = /pub/ietf/uri/
$6 = <undefined>
$7 = <undefined>
$8 = #Related
$9 = Related

빠른 시작 : 인코딩

$url1 = [uri]::EscapeDataString("http://test.com?test=my value")
# url1: http%3A%2F%2Ftest.com%3Ftest%3Dmy%20value

$url2 = [uri]::EscapeUriString("http://test.com?test=my value")
# url2: http://test.com?test=my%20value

# HttpUtility requires at least .NET 1.1 to be installed.
$url3 = [System.Web.HttpUtility]::UrlEncode("http://test.com?test=my value")
# url3: http%3a%2f%2ftest.com%3ftest%3dmy+value

참고 : HTTPUtility에 대한 자세한 정보 .

빠른 시작 : 디코딩

참고 : 이 예제는 위의 빠른 시작 : 인코딩 섹션에서 생성 된 변수를 사용합니다.

# url1: http%3A%2F%2Ftest.com%3Ftest%3Dmy%20value
[uri]::UnescapeDataString($url1)
# Returns: http://test.com?test=my value

# url2: http://test.com?test=my%20value
[uri]::UnescapeDataString($url2)
# Returns: http://test.com?test=my value

# url3: http%3a%2f%2ftest.com%3ftest%3dmy+value
[uri]::UnescapeDataString($url3)
# Returns: http://test.com?test=my+value

# Note: There is no `[uri]::UnescapeUriString()`; 
#       which makes sense since the `[uri]::UnescapeDataString()` 
#       function handles everything it would handle plus more.

# HttpUtility requires at least .NET 1.1 to be installed.
# url1: http%3A%2F%2Ftest.com%3Ftest%3Dmy%20value
[System.Web.HttpUtility]::UrlDecode($url1)
# Returns: http://test.com?test=my value

# HttpUtility requires at least .NET 1.1 to be installed.
# url2: http://test.com?test=my%20value
[System.Web.HttpUtility]::UrlDecode($url2)
# Returns: http://test.com?test=my value

# HttpUtility requires at least .NET 1.1 to be installed.
# url3: http%3a%2f%2ftest.com%3ftest%3dmy+value
[System.Web.HttpUtility]::UrlDecode($url3)
# Returns: http://test.com?test=my value

참고 : HTTPUtility에 대한 자세한 정보 .

`[uri] :: EscapeDataString ()`으로 질의 문자열 인코딩

$scheme = 'https'
$url_format = '{0}://example.vertigion.com/foos?{1}'
$qs_data = @{
    'foo1'='bar1';
    'foo2'= 'complex;/?:@&=+$, bar''"';
    'complex;/?:@&=+$, foo''"'='bar2';
}

[System.Collections.ArrayList] $qs_array = @()
foreach ($qs in $qs_data.GetEnumerator()) {
    $qs_key = [uri]::EscapeDataString($qs.Name)
    $qs_value = [uri]::EscapeDataString($qs.Value)
    $qs_array.Add("${qs_key}=${qs_value}") | Out-Null
}

$url = $url_format -f @([uri]::"UriScheme${scheme}", ($qs_array -join '&'))

[uri]::EscapeDataString() 을 사용하면 아포스트로피 ( ' )가 인코딩되지 않았다는 것을 알 수 있습니다.

https://example.vertigion.com/foos ? foo2 = 복소수 % 3B % 2F % 3F % 3A % 40 % 26 % 3D % 2B % 24 % 2C % 20bar '% 22'% 복합물 % 3B % 2F % 3F % 3A % 40 % 26 % 3D % 2B % 24 % 2C % 20foo '% 22 = bar2 & foo1 = bar1

`[System.Web.HttpUtility] :: UrlEncode ()로 쿼리 문자열 인코딩

$scheme = 'https'
$url_format = '{0}://example.vertigion.com/foos?{1}'
$qs_data = @{
    'foo1'='bar1';
    'foo2'= 'complex;/?:@&=+$, bar''"';
    'complex;/?:@&=+$, foo''"'='bar2';
}

[System.Collections.ArrayList] $qs_array = @()
foreach ($qs in $qs_data.GetEnumerator()) {
    $qs_key = [System.Web.HttpUtility]::UrlEncode($qs.Name)
    $qs_value = [System.Web.HttpUtility]::UrlEncode($qs.Value)
    $qs_array.Add("${qs_key}=${qs_value}") | Out-Null
}

$url = $url_format -f @([uri]::"UriScheme${scheme}", ($qs_array -join '&'))

[System.Web.HttpUtility]::UrlEncode() 를 사용하면 공백이 %20 대신 더하기 기호 ( + )로 바뀌는 것을 볼 수 있습니다.

https://example.vertigion.com/foos ? foo2 = 복합체 % 3b % 2f % 3f % 3a % 40 % 26 % 3d % 2b % 24 % 2c + bar % 27 % 22 & complex % 3b % 2f % 3f % 3a % 40 % 26 % 3d % 2b % 24 % 2c + foo % 27 % 22 = bar2 & foo1 = bar1

`[uri] :: UnescapeDataString ()으로 URL 디코딩

[uri]::EscapeDataString() 인코딩 [uri]::EscapeDataString()

먼저, 위 예제에서 [uri]::EscapeDataString() 으로 인코딩 된 URL과 쿼리 문자열을 디코딩합니다.

https://example.vertigion.com/foos ? foo2 = 복소수 % 3B % 2F % 3F % 3A % 40 % 26 % 3D % 2B % 24 % 2C % 20bar '% 22'% 복합물 % 3B % 2F % 3F % 3A % 40 % 26 % 3D % 2B % 24 % 2C % 20foo '% 22 = bar2 & foo1 = bar1

$url = 'https://example.vertigion.com/foos?foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar''%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo''%22=bar2&foo1=bar1'
$url_parts_regex = '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' # See Remarks

if ($url -match $url_parts_regex) {
    $url_parts = @{
        'Scheme' = $Matches[2];
        'Server' = $Matches[4];
        'Path' = $Matches[5];
        'QueryString' = $Matches[7];
        'QueryStringParts' = @{}
    }

    foreach ($qs in $query_string.Split('&')) {
        $qs_key, $qs_value = $qs.Split('=')
        $url_parts.QueryStringParts.Add(
            [uri]::UnescapeDataString($qs_key),
            [uri]::UnescapeDataString($qs_value)
        ) | Out-Null
    }
} else {
    Throw [System.Management.Automation.ParameterBindingException] "Invalid URL Supplied"
}

이렇게하면 [hashtable]$url_parts ; 이는 동일 (참고 : 복잡한 부품의 공백 스페이스이다)

PS > $url_parts

Name                           Value
----                           -----
Scheme                         https
Path                           /foos
Server                         example.vertigion.com
QueryString                    foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar'%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo'%22=bar2&foo1=bar1
QueryStringParts               {foo2, complex;/?:@&=+$, foo'", foo1}


PS > $url_parts.QueryStringParts

Name                           Value
----                           -----
foo2                           complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'"        bar2
foo1                           bar1

[System.Web.HttpUtility]::UrlEncode() 인코딩 [System.Web.HttpUtility]::UrlEncode()

이제 위의 예에서 [System.Web.HttpUtility]::UrlEncode() 로 인코딩 된 URL과 쿼리 문자열을 디코딩합니다.

https://example.vertigion.com/foos ? foo2 = 복합체 % 3b % 2f % 3f % 3a % 40 % 26 % 3d % 2b % 24 % 2c + bar % 27 % 22 & complex % 3b % 2f % 3f % 3a % 40 % 26 % 3d % 2b % 24 % 2c + foo % 27 % 22 = bar2 & foo1 = bar1

$url = 'https://example.vertigion.com/foos?foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=bar2&foo1=bar1'
$url_parts_regex = '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' # See Remarks

if ($url -match $url_parts_regex) {
    $url_parts = @{
        'Scheme' = $Matches[2];
        'Server' = $Matches[4];
        'Path' = $Matches[5];
        'QueryString' = $Matches[7];
        'QueryStringParts' = @{}
    }

    foreach ($qs in $query_string.Split('&')) {
        $qs_key, $qs_value = $qs.Split('=')
        $url_parts.QueryStringParts.Add(
            [uri]::UnescapeDataString($qs_key),
            [uri]::UnescapeDataString($qs_value)
        ) | Out-Null
    }
} else {
    Throw [System.Management.Automation.ParameterBindingException] "Invalid URL Supplied"
}

이렇게하면 다음과 같은 [hashtable]$url_parts ( 참고 : 복잡한 부분의 공백 은 첫 번째 부분의 더하기 기호 ( + )이고 두 번째 부분의 공백 임).

PS > $url_parts

Name                           Value
----                           -----
Scheme                         https
Path                           /foos
Server                         example.vertigion.com
QueryString                    foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=bar2&foo1=bar1
QueryStringParts               {foo2, complex;/?:@&=+$, foo'", foo1}


PS > $url_parts.QueryStringParts

Name                           Value
----                           -----
foo2                           complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'"        bar2
foo1                           bar1

`[System.Web.HttpUtility] :: UrlDecode ()로 URL 디코딩

[uri]::EscapeDataString() 인코딩 [uri]::EscapeDataString()

먼저, 위 예제에서 [uri]::EscapeDataString() 으로 인코딩 된 URL과 쿼리 문자열을 디코딩합니다.

https://example.vertigion.com/foos ? foo2 = 복소수 % 3B % 2F % 3F % 3A % 40 % 26 % 3D % 2B % 24 % 2C % 20bar '% 22'% 복합물 % 3B % 2F % 3F % 3A % 40 % 26 % 3D % 2B % 24 % 2C % 20foo '% 22 = bar2 & foo1 = bar1

$url = 'https://example.vertigion.com/foos?foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar''%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo''%22=bar2&foo1=bar1'
$url_parts_regex = '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' # See Remarks

if ($url -match $url_parts_regex) {
    $url_parts = @{
        'Scheme' = $Matches[2];
        'Server' = $Matches[4];
        'Path' = $Matches[5];
        'QueryString' = $Matches[7];
        'QueryStringParts' = @{}
    }

    foreach ($qs in $query_string.Split('&')) {
        $qs_key, $qs_value = $qs.Split('=')
        $url_parts.QueryStringParts.Add(
            [System.Web.HttpUtility]::UrlDecode($qs_key),
            [System.Web.HttpUtility]::UrlDecode($qs_value)
        ) | Out-Null
    }
} else {
    Throw [System.Management.Automation.ParameterBindingException] "Invalid URL Supplied"
}

이렇게하면 [hashtable]$url_parts ; 이는 동일 (참고 : 복잡한 부품의 공백 스페이스이다)

PS > $url_parts

Name                           Value
----                           -----
Scheme                         https
Path                           /foos
Server                         example.vertigion.com
QueryString                    foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar'%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo'%22=bar2&foo1=bar1
QueryStringParts               {foo2, complex;/?:@&=+$, foo'", foo1}


PS > $url_parts.QueryStringParts

Name                           Value
----                           -----
foo2                           complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'"        bar2
foo1                           bar1

[System.Web.HttpUtility]::UrlEncode() 인코딩 [System.Web.HttpUtility]::UrlEncode()

이제 위의 예에서 [System.Web.HttpUtility]::UrlEncode() 로 인코딩 된 URL과 쿼리 문자열을 디코딩합니다.

https://example.vertigion.com/foos ? foo2 = 복합체 % 3b % 2f % 3f % 3a % 40 % 26 % 3d % 2b % 24 % 2c + bar % 27 % 22 & complex % 3b % 2f % 3f % 3a % 40 % 26 % 3d % 2b % 24 % 2c + foo % 27 % 22 = bar2 & foo1 = bar1

$url = 'https://example.vertigion.com/foos?foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=bar2&foo1=bar1'
$url_parts_regex = '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' # See Remarks

if ($url -match $url_parts_regex) {
    $url_parts = @{
        'Scheme' = $Matches[2];
        'Server' = $Matches[4];
        'Path' = $Matches[5];
        'QueryString' = $Matches[7];
        'QueryStringParts' = @{}
    }

    foreach ($qs in $query_string.Split('&')) {
        $qs_key, $qs_value = $qs.Split('=')
        $url_parts.QueryStringParts.Add(
            [System.Web.HttpUtility]::UrlDecode($qs_key),
            [System.Web.HttpUtility]::UrlDecode($qs_value)
        ) | Out-Null
    }
} else {
    Throw [System.Management.Automation.ParameterBindingException] "Invalid URL Supplied"
}

이렇게하면 [hashtable]$url_parts ; 이는 동일 (참고 : 복잡한 부품의 공백 스페이스이다)

PS > $url_parts

Name                           Value
----                           -----
Scheme                         https
Path                           /foos
Server                         example.vertigion.com
QueryString                    foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=bar2&foo1=bar1
QueryStringParts               {foo2, complex;/?:@&=+$, foo'", foo1}


PS > $url_parts.QueryStringParts

Name                           Value
----                           -----
foo2                           complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'"        bar2
foo1                           bar1


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow