2024年PHP开发者大会日本站

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 条注释

alejandro at devenet dot net
13年前
当客户端发送GET数据时,utf-8字符编码在urlencode方面存在一个小问题。
考虑一下“º”字符。
一些客户端可能会发送(例如)
foo.php?myvar=%BA
而其他客户端发送
foo.php?myvar=%C2%BA(正确的URL编码)

在这种情况下,您将值赋给变量$x

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

$x存储:在第一种情况下为“�”(错误),在第二种情况下为“º”(正确)

要解决这个问题,您可以使用此函数

<?php
function to_utf8( $string ) {
// 来自 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);
}
}
?>

并以此方式赋值

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

$x存储:在第一种情况下为“º”(正确),在第二种情况下为“º”(正确)

解决了大量的i18n问题。

请在下一个PHP版本中修复$_GET变量的自动urldecode。

再见。

Alejandro Salamanca
Visual
18年前
如果您在javascript中转义字符串,并希望使用urldecode在PHP中解码它们(或者希望当您将它们放入查询字符串或post请求中时,PHP自动解码它们),则应使用javascript函数encodeURIComponent()而不是escape()。然后您就不需要前面评论中提到的任何花哨的自定义utf_urldecode函数。
tomas at penajaca dot com dot br
21年前
urldecode不会解码“%0”,而是绕过它。当您使用固定长度字符串时,这可能会导致问题。

您可以使用下面的函数。

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");
}
Joe
16年前
值得指出的是,如果您使用AJAX并且需要编码发送到PHP应用程序的字符串,则可能不需要在PHP中解码它们。

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

如果消息已编码,则将正确输出使用javascript代码发送的消息

message = encodeURIComponent(message)

并使用AJAX POST请求和标题发送
ajaxVar.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
[email protected]
4年前
根据 HTML x-www-form-url-encoded 媒体类型,“+”被空格替换
参见 http://www.faqs.org/rfcs/rfc1866.html
To Top