PHP 8.4.0 RC4 available for testing

urldecode

(PHP 4, PHP 5, PHP 7, PHP 8)

urldecode解码已编码的 URL 字符串

说明

urldecode(string $string): string

解码给出的已编码字符串中的任何 %##。 加号('+')被解码成一个空格字符。

参数

string

要解码的字符串。

返回值

返回解码后的字符串。

示例

示例 #1 urldecode() 示例

<?php
$query
= "my=apples&are=green+and+red";

foreach (
explode('&', $query) as $chunk) {
$param = explode("=", $chunk);

if (
$param) {
printf("Value for parameter \"%s\" is \"%s\"<br/>\n", urldecode($param[0]), urldecode($param[1]));
}
}
?>

注释

警告

超全局变量 $_GET$_REQUEST 已经被解码了。对 $_GET$_REQUEST 里的元素使用 urldecode() 将会导致不可预计和危险的结果。

参见

添加备注

用户贡献的备注 5 notes

up
37
alejandro at devenet dot net
13 years ago
When the client send Get data, utf-8 character encoding have a tiny problem with the urlencode.
Consider the "º" character.
Some clients can send (as example)
foo.php?myvar=%BA
and another clients send
foo.php?myvar=%C2%BA (The "right" url encoding)

in this scenary, you assign the value into variable $x

<?php
$x
= $_GET['myvar'];
?>

$x store: in the first case "�" (bad) and in the second case "º" (good)

To fix that, you can use this function:

<?php
function to_utf8( $string ) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
if ( preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs'
, $string) ) {
return
$string;
} else {
return
iconv( 'CP1252', 'UTF-8', $string);
}
}
?>

and assign in this way:

<?php
$x
= to_utf8( $_GET['myvar'] );
?>

$x store: in the first case "º" (good) and in the second case "º" (good)

Solve a lot of i18n problems.

Please fix the auto-urldecode of $_GET var in the next PHP version.

Bye.

Alejandro Salamanca
up
13
Visual
18 years ago
If you are escaping strings in javascript and want to decode them in PHP with urldecode (or want PHP to decode them automatically when you're putting them in the query string or post request), you should use the javascript function encodeURIComponent() instead of escape(). Then you won't need any of the fancy custom utf_urldecode functions from the previous comments.
up
4
tomas at penajaca dot com dot br
21 years ago
urldecode does not decode "%0" bypassing it. I can cause troble when you are working with fixed lenght strings.

You can you the function below.

function my_urldecode($string){

$array = split ("%",$string);

if (is_array($array)){
while (list ($k,$v) = each ($array)){
$ascii = base_convert ($v,16,10);
$ret .= chr ($ascii);
}
}
return ("$ret");
}
up
3
Joe
16 years ago
It's worth pointing out that if you are using AJAX and need to encode strings that are being sent to a PHP application, you may not need to decode them in PHP.

<?php
echo stripslashes(nl2br($_POST['message']));
?>

Will properly output a message sent with the javascript code if the message is encoded:

message = encodeURIComponent(message)

And is sent with an AJAX POST request with the header:
ajaxVar.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
up
1
bloodjazman at gmail dot com
4 years ago
"+" replaced by space according to HTML x-www-form-url-encoded media type
see http://www.faqs.org/rfcs/rfc1866.html
To Top