PowerShell
Kodowanie / dekodowanie adresu URL
Szukaj…
Uwagi
Wyrażenie regularne użyte w przykładach dekodowania adresu URL zostało zaczerpnięte z RFC 2396, dodatek B: Analiza odwołania do identyfikatora URI za pomocą wyrażenia regularnego ; dla potomnych, oto cytat:
Poniższy wiersz jest wyrażeniem regularnym służącym do podziału odwołania URI na jego składniki.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9
Liczby w drugim wierszu powyżej mają jedynie na celu poprawę czytelności; wskazują punkty odniesienia dla każdego podwyrażenia (tj. dla każdego sparowanego nawiasu). Odwołujemy się do wartości dopasowanej do podwyrażenia jako $. Na przykład dopasowanie powyższego wyrażenia do
http://www.ics.uci.edu/pub/ietf/uri/#Related
powoduje następujące dopasowania podwyrażenia:
$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
Szybki start: kodowanie
$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
Uwaga: Więcej informacji na temat HTTPUtility .
Szybki start: dekodowanie
Uwaga: w tych przykładach wykorzystano zmienne utworzone w sekcji Szybki start: Kodowanie powyżej.
# 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
Uwaga: Więcej informacji na temat HTTPUtility .
Zakoduj ciąg zapytania za pomocą `[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 '&'))
Za pomocą [uri]::EscapeDataString()
zauważysz, że apostrof ( '
) nie został zakodowany:
https://example.vertigion.com/foos ? foo2 = kompleks% 3B% 2F% 3F% 3A% 40% 26% 3D% 2B% 24% 2C% 20bar '% 22 i kompleks% 3B% 2F% 3F% 3A% 40% 26% 3D% 2B% 24% 2C% 20foo '% 22 = bar2 i foo1 = bar1
Zakoduj ciąg zapytania za pomocą `[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 '&'))
Dzięki [System.Web.HttpUtility]::UrlEncode()
zauważysz, że spacje są zamieniane na znaki plus ( +
) zamiast %20
:
https://example.vertigion.com/foos ? foo2 = kompleks% 3b% 2f% 3f% 3a% 40% 26% 3d% 2b% 24% 2c + słupek 27% 22 i kompleks% 3b% 2f% 3f% 3a% 40% 26% 3d% 2b% 24% 2c + foo% 27% 22 = bar2 i foo1 = bar1
Dekoduj adres URL za pomocą `[uri] :: UnescapeDataString ()`
Zakodowane za pomocą [uri]::EscapeDataString()
Najpierw zdekodujemy adres URL i ciąg zapytania zakodowany za pomocą [uri]::EscapeDataString()
w powyższym przykładzie:
https://example.vertigion.com/foos ? foo2 = kompleks% 3B% 2F% 3F% 3A% 40% 26% 3D% 2B% 24% 2C% 20bar '% 22 i kompleks% 3B% 2F% 3F% 3A% 40% 26% 3D% 2B% 24% 2C% 20foo '% 22 = bar2 i 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"
}
To daje ci [hashtable]$url_parts
; co jest równe ( Uwaga: spacje w częściach złożonych są spacjami ):
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
Zakodowane za pomocą [System.Web.HttpUtility]::UrlEncode()
Teraz zdekodujemy adres URL i ciąg zapytania zakodowany za pomocą [System.Web.HttpUtility]::UrlEncode()
w powyższym przykładzie:
https://example.vertigion.com/foos ? foo2 = kompleks% 3b% 2f% 3f% 3a% 40% 26% 3d% 2b% 24% 2c + słupek 27% 22 i kompleks% 3b% 2f% 3f% 3a% 40% 26% 3d% 2b% 24% 2c + foo% 27% 22 = bar2 i 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"
}
To daje ci [hashtable]$url_parts
, co jest równe ( Uwaga: spacje w częściach złożonych to znaki plus ( +
) w pierwszej części i spacje w drugiej części):
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
Dekoduj adres URL za pomocą `[System.Web.HttpUtility] :: UrlDecode ()`
Zakodowane za pomocą [uri]::EscapeDataString()
Najpierw zdekodujemy adres URL i ciąg zapytania zakodowany za pomocą [uri]::EscapeDataString()
w powyższym przykładzie:
https://example.vertigion.com/foos ? foo2 = kompleks% 3B% 2F% 3F% 3A% 40% 26% 3D% 2B% 24% 2C% 20bar '% 22 i kompleks% 3B% 2F% 3F% 3A% 40% 26% 3D% 2B% 24% 2C% 20foo '% 22 = bar2 i 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"
}
To daje ci [hashtable]$url_parts
; co jest równe ( Uwaga: spacje w częściach złożonych są spacjami ):
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
Zakodowane za pomocą [System.Web.HttpUtility]::UrlEncode()
Teraz zdekodujemy adres URL i ciąg zapytania zakodowany za pomocą [System.Web.HttpUtility]::UrlEncode()
w powyższym przykładzie:
https://example.vertigion.com/foos ? foo2 = kompleks% 3b% 2f% 3f% 3a% 40% 26% 3d% 2b% 24% 2c + słupek 27% 22 i kompleks% 3b% 2f% 3f% 3a% 40% 26% 3d% 2b% 24% 2c + foo% 27% 22 = bar2 i 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"
}
To daje ci [hashtable]$url_parts
; co jest równe ( Uwaga: spacje w częściach złożonych są spacjami ):
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