urlencode

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

urlencode对字符串进行 URL 编码

说明

urlencode(string $string): string

此函数在将字符串编码为用于 URL 查询部分时非常方便,它是一种将变量传递到下一页的便捷方法。

参数

string

要编码的字符串。

返回值

返回一个字符串,其中所有非字母数字字符(除了 -_.)都被替换为百分号 (%) 后跟两位十六进制数字,空格被编码为加号 (+) 符号。它以与 WWW 表单中发布的数据相同的方式进行编码,即与 application/x-www-form-urlencoded 媒体类型相同的方式。这与 » RFC 3986 编码(参见 rawurlencode())不同,因为出于历史原因,空格被编码为加号 (+) 符号。

示例

示例 #1 urlencode() 示例

<?php
$userinput
= 'Data123!@-_ +';
echo
"UserInput: $userinput\n";
echo
'<a href="mycgi?foo=', urlencode($userinput), '">';
?>

以上示例将输出

UserInput: Data123!@-_ +
<a href="mycgi?foo=Data123%21%40-_+%2B">

示例 #2 urlencode()htmlentities() 示例

<?php
$foo
= 'Data123!@-_ +';
$bar = "Not the same content as $foo";
echo
"foo: $foo\n";
echo
"bar: $bar\n";
$query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
echo
'<a href="mycgi?' . htmlentities($query_string) . '">';
?>

以上示例将输出

foo: Data123!@-_ +
bar: Not the same content as Data123!@-_ +
<a href="mycgi?foo=Data123%21%40-_+%2B&amp;bar=Not+the+same+content+as+Data123%21%40-_+%2B">

注释

注意:

注意可能与 HTML 实体匹配的变量。诸如 &amp、&copy 和 &pound 之类的内容由浏览器解析,并使用实际实体而不是所需的变量名。这是一个显而易见的问题,W3C 已经告诉人们很多年了。参考资料如下:» http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2.

PHP 支持通过 arg_separator .ini 指令将参数分隔符更改为 W3C 建议的分号。不幸的是,大多数用户代理不会以这种分号分隔的格式发送表单数据。一个更便携的解决方法是使用 &amp; 而不是 & 作为分隔符。您不需要为此更改 PHP 的 arg_separator。将其保留为 &,但只需使用 htmlentities()htmlspecialchars() 对您的 URL 进行编码。

参见

添加注释

用户贡献的注释 26 个注释

65
davis dot peixoto at gmail dot com
14 年前
urlencode 函数和 rawurlencode 主要基于 RFC 1738。

然而,自 2005 年以来,当前用于 URI 标准的 RFC 是 RFC 3986。

以下是一个根据 RFC 3986 对 URL 进行编码的函数。

<?php
function myUrlEncode($string) {
$entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
$replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
return
str_replace($entities, $replacements, urlencode($string));
}
?>
2
materialsmoke at gmail dot com
11 个月前
此函数将对 URL 进行编码,同时保留 URL 的功能,因此您可以将其复制并粘贴到浏览器中
```
function urlEncode($url) {
$parsedUrl = parse_url($url);

$encodedScheme = urlencode($parsedUrl['scheme']);
$encodedHost = urlencode($parsedUrl['host']);

$encodedPath = implode('/', array_map('urlencode', explode('/', $parsedUrl['path'])));
if (isset($parsedUrl['query'])) {
$encodedQuery = '?' . urlencode($parsedUrl['query']);
} else {
$encodedQuery = '';
}

return "{$encodedScheme}://{$encodedHost}{$encodedPath}{$encodedQuery}";
}
```
10
temu92 at gmail dot com
15 年前
我需要对 UTF8 url 进行编码和解码,我想出了这些非常简单的函数。希望这有帮助!

<?php
function url_encode($string){
return
urlencode(utf8_encode($string));
}

function
url_decode($string){
return
utf8_decode(urldecode($string));
}
?>
9
omid at omidsakhi dot com
14 年前
我需要一个PHP函数来完成与Javascript中的完整转义函数相同的工作。我花了一些时间才找到它。但最后我决定写我自己的代码。所以只是为了节省时间

<?php
function fullescape($in)
{
$out = '';
for (
$i=0;$i<strlen($in);$i++)
{
$hex = dechex(ord($in[$i]));
if (
$hex=='')
$out = $out.urlencode($in[$i]);
else
$out = $out .'%'.((strlen($hex)==1) ? ('0'.strtoupper($hex)):(strtoupper($hex)));
}
$out = str_replace('+','%20',$out);
$out = str_replace('_','%5F',$out);
$out = str_replace('.','%2E',$out);
$out = str_replace('-','%2D',$out);
return
$out;
}
?>

它可以使用Javascript中的unescape函数完全解码。
7
daniel+php at danielnorton dot com
15 年前
如果文本包含电子邮件地址,请不要使用urlencode()或urldecode(),因为它会破坏“+”字符,而“+”字符是电子邮件地址中完全有效的字符。

除非您确定不会对电子邮件地址进行编码,并且需要非标准“+”用法提供的可读性,否则始终使用rawurlencode()或rawurldecode()。
1
izhankhalib at gmail dot com
10年前
以下是我们在MongoDB中的jsonform源代码,其中包含大量的双引号。我们能够通过使用PHP urlencode将此源代码传递给ajax表单提交函数

<script type="text/javascript">
$(function() {
// 使用jquery.dfrom生成表单
$("#myform").dform({

"html":[
{
"type":"p",
"html":"Patient Record"
},
{
"name":"patient.name.first",
"id":"txt-patient.name.first",
"caption":"first name",
"type":"text",
},
{

"name":"patient.name.last",
"id":"txt-patient.name.last",
"caption":"last name",
"type":"text",
},
{
"type" : "submit",
}

]
});
});
</script>
<form id="myform">

<?php
// 从mongodb获取json源代码
$jsonform= urlencode($this->data['Post']['jsonform']);

?>
//AJAX提交表单
<script type="text/javascript">
$('#myform').submit(function(){


// 将PHP变量传递给javascript
var thejsonform="<?php echo $jsonform ?>";

//var fname = $('input#fname').val();
var dataString = "jsonform=" + thejsonform ;

$.ajax({
type: "POST",
// url: "test1.php",
data: dataString,
success: function() {

}
});


return false;
});
2
ahrensberg at gmail dot com
17年前
正如“Benjamin dot Bruno at web dot de”之前所写,您可能会遇到将包含特殊字符的字符串编码为flash时出现问题。Benjamin写道

<?php
function flash_encode ($input)
{
return
rawurlencode(utf8_encode($input));
}
?>

... 可以解决问题。不幸的是,flash在读取某些引号时仍然存在问题,但使用这个

<?php
function flash_encode($string)
{
$string = rawurlencode(utf8_encode($string));

$string = str_replace("%C2%96", "-", $string);
$string = str_replace("%C2%91", "%27", $string);
$string = str_replace("%C2%92", "%27", $string);
$string = str_replace("%C2%82", "%27", $string);
$string = str_replace("%C2%93", "%22", $string);
$string = str_replace("%C2%94", "%22", $string);
$string = str_replace("%C2%84", "%22", $string);
$string = str_replace("%C2%8B", "%C2%AB", $string);
$string = str_replace("%C2%9B", "%C2%BB", $string);

return
$string;
}
?>

... 应该可以解决这个问题。
0
youhanasobhy15 at gmail dot com
6年前
请记住,如果您为连接准备URL并对某些参数使用了urlencode,而对其他参数没有使用,那么如果未编码的参数包含urlencode编码的特殊字符,它在目标位置将不会自动解码。

例如

$xml = simplexml_load_file("http://www.testing.com?me=test&first=".urlencode('dummy string')."&second=here is the string");

第二个参数包含空格,urlencode将其转换为(+)。

使用此URL后,服务器将发现第二个参数没有被编码,那么服务器不会自动解码它。

花了2个多小时才发现,希望可以节省您的时间。
0
root at jusme dot org
16年前
我运行的是PHP版本5.0.5,urlencode()似乎没有对“#”字符进行编码,尽管函数的描述说它对“所有非字母数字”字符进行编码。当我尝试打开文件名中包含“#”的本地文件时,这是一个特殊的问题,因为Firefox会将其解释为锚点目标(无论好坏)。似乎需要手动str_replace,除非在将来的PHP版本中修复了这个问题。

示例

$str = str_replace("#", "%23", $str);
-2
david winiecki gmail
9年前
从PHP 5.3.0开始,urlencode和rawurlencode也有所不同,rawurlencode不会对~(波浪号)进行编码,而urlencode则会。
-2
kL
17年前
Apache的mod_rewrite和mod_proxy无法正确处理url编码的URL - http://issues.apache.org/bugzilla/show_bug.cgi?id=34602

如果您需要使用任何这些模块并处理包含%2F或%3A(以及其他几个编码的特殊URL字符)的路径,您需要使用不同的编码方案。

我的解决方案是用“'”替换“%”。
<?php
function urlencode($u)
{
return
str_replace(array("'",'%'),array('%27',"'"),urlencode($u));
}

function
urldecode($u)
{
return
urldecode(strtr($u,"'",'%'));
}
?>
-2
lekiagospel@gmail dot com
3年前
使用某些URL缩短服务时,urlencode很有用。

如果未编码,缩短器返回的URL可能会被截断。确保在将URL传递给缩短器之前对其进行编码。

示例

$url = "https://www.notarealurl.com?id=50&name=namestring";
$encodedurl = urlencode($url);
$shorturl = UrlShortener::shortenUrl( $encodedurl);
-3
frx dot apps at gmail dot com
14 年前
我写了这个简单的函数,它可以从数组中创建一个 GET 查询(用于 URL)。

<?php
function encode_array($args)
{
if(!
is_array($args)) return false;
$c = 0;
$out = '';
foreach(
$args as $name => $value)
{
if(
$c++ != 0) $out .= '&';
$out .= urlencode("$name").'=';
if(
is_array($value))
{
$out .= urlencode(serialize($value));
}else{
$out .= urlencode("$value");
}
}
return
$out . "\n";
}
?>

如果 $args 数组中包含数组,则在进行 urlencode 之前会对其进行序列化。

一些例子
<?php
echo encode_array(array('foo' => 'bar')); // foo=bar
echo encode_array(array('foo&bar' => 'some=weird/value')); // foo%26bar=some%3Dweird%2Fvalue
echo encode_array(array('foo' => 1, 'bar' => 'two')); // foo=1&bar=two
echo encode_array(array('args' => array('key' => 'value'))); // args=a%3A1%3A%7Bs%3A3%3A%22key%22%3Bs%3A5%3A%22value%22%3B%7D
?>
-3
neugey at cox dot net
19 年前
在 PHP 5 中对来自 simplexml 的字符串进行编码时要小心。如果你尝试对 simplexml 对象进行 urlencode,脚本就会崩溃。

我通过使用强制类型转换解决了这个问题。

$newValue = urlencode( (string) $oldValue );
-3
admin at server dot net
4 年前
urlencode 对应于 RFC 1866 中对 application/x-www-form-urlencoded 的定义 (https://tools.ietf.org/html/rfc1866#section-8.2.1),而不是 URI 中的 url 编码部分。仅使用 rawurlencode 对原始 URI 部分(例如查询/搜索部分)进行编码!
-3
in reply to "kL"
17年前
kL 的例子有很大的错误,因为它会循环自身,而且 encode 函数是双向的。

为什么你要在同一个字符串中将所有 %27 替换为 ',而在同一个字符串中将所有 ' 替换为 %27 呢?

假设我有一个字符串:Hello %27World%27。天气很好。
我得到:Hello Hello 'World'。It%27s a nice day。

换句话说,这种解决方案非常没有用。

解决方案
在编码时只将 ' 替换为 %27
在解码时只将 %27 替换为 '。或者直接使用 url_decode。
-5
R Mortimer
18 年前
不要让浏览器自动对无效 URL 进行编码。并非所有浏览器都执行相同的编码。保持跨浏览器兼容性,在服务器端进行编码。
-4
no_gravity
4 年前
我认为描述与函数的功能不完全匹配

返回一个字符串,其中所有非字母数字字符
除了 -_. 之外,都被替换为百分号 (%) 后面
加上两个十六进制数字,空格编码为加号 (+) 符号。

urlencode('ö') 给我的结果是 '%C3%B6'。所以不止是百分号后面加上两个十六进制数字。
-7
monty3 at hotmail dot com
19 年前
如果你想将一个带有参数的 URL 作为值传递到另一个 URL 中,并且还要通过 JavaScript 函数,比如...

<a href="javascript:openWin('page.php?url=index.php?id=4&pg=2');">

...将 URL 值通过 PHP urlencode() 函数进行两次编码,像这样...

<?php

$url
= "index.php?id=4&pg=2";
$url = urlencode(urlencode($url));

echo
"<a href=\"javascript:openWin('page.php?url=$url');\">";
?>

在被 JavaScript 函数(page.php)打开的页面上,你只需要 urldecode() 一次,因为当 JavaScript "接触" 传递给它的 URL 时,它会自己解码一次 URL。所以,在你 PHP 脚本中再解码一次,就能完全撤销双重编码...

<?php

$url
= urldecode($_GET['url']);
?>

如果你不这样做,你会发现目标脚本中的 URL 值会丢失所有在问号 ? 后面的 var=values...

index.php?id=4
-4
GeorgeOxymn
2 年前
成为真正的中世纪王国的国王!
激动人心的 RPG 游戏和城堡模拟器
https://fas.st/tdhru
-8
torecs at sfe dot uio dot no
18 年前
这个非常简单的函数创建了一个有效的 URL 参数部分,对我来说,它看起来像是这里的一些其他版本错误地解码了,因为它们没有将 & 分隔变量转换为 &amp;。

$vars=array('name' => 'tore','action' => 'sell&buy');
echo MakeRequestUrl($vars);

/* 通过解析 params 数组创建有效的 HTML 请求 URL
* @param $params 要转换为 URL 的参数,其中键作为名称。
*/
function MakeRequestUrl($params)
{
$querystring=null;
foreach ($params as $name => $value)
{
$querystring=$name.'='.urlencode($value).'&'.$querystring;
}
// 剪切最后一个 '&'
$querystring=substr($querystring,0,strlen($querystring)-1);
return htmlentities($querystring);
}

输出结果:action=sell%26buy&amp;name=tore
-8
bisqwit at iki dot fi
18 年前
安全地构建超链接 HOW-TO

<?php
$path_component
= 'machine/generated/part';
$url_parameter1 = 'this is a string';
$url_parameter2 = 'special/weird "$characters"';

$url = 'http://example.com/lab/cgi/test/'. rawurlencode($path_component) . '?param1=' . urlencode($url_parameter1) . '&param2=' . urlencode($url_parameter2);

$link_label = "Click here & you'll be <happy>";

echo
'<a href="', htmlspecialchars($url), '">', htmlspecialchars($link_label), '</a>';
?>

这个例子涵盖了安全地创建 URL 所需的所有编码,不会出现任何特殊字符的问题。令人惊奇的是,有很多人在这方面犯了错误。

简而言之
- 对所有 GET 参数(每个 "=" 后面的内容)使用 urlencode。
- 对 "?" 之前的部分使用 rawurlencode。
- 对 HTML 标签参数和 HTML 文本内容使用 htmlspecialchars。
-11
edwardzyang at thewritingpot dot com
19 年前
我正在用一些奇怪的字符实体测试我的输入消毒。像 ? 和 ? 这样的实体被正确地传递,并且在我未经任何过滤就传递它们时,它们以原始形式存在。

然而,在处理像 (这些是 HTML 实体) 这样的字符时,会出现一些奇怪的事情:&#8252; &#9616; &#9488; 和 &#920; 会出现奇怪的事情。

如果你尝试在 Internet Explorer 中传递其中一个字符,IE 会 *禁用* 提交按钮。然而,Firefox 的行为更奇怪:它会将它转换为它的 HTML 实体。它会正确地显示,但只有当你没有转换实体时。

重点是什么?小心使用装饰字符。

PS:如果你尝试将这些字符中的一个复制粘贴到一个 TXT 文件中,它会被翻译为 ?。
-13
Mark Seecof
15 年前
当使用 XMLHttpRequest 或其他 AJAX 技术使用 GET(或 POST,content-type 标头设置为 'x-www-form-urlencoded')将数据提交到 PHP 脚本时,你必须在上传数据之前对其进行 urlencode。(实际上,如果你不进行 urlencode POST 数据,MS Internet Explorer 可能会在你调用 XMLHttpRequest.send() 时弹出 "语法错误" 对话框。)但是,你不能在 JavaScript 中调用 PHP 的 urlencode() 函数!实际上,没有哪个原生 JavaScript 函数能够正确地对表单提交进行 urlencode。所以这里有一个函数可以相当高效地完成这项工作

<?php /******

<script type="text/javascript" language="javascript1.6">
// PHP-compatible urlencode() for Javascript
function urlencode(s) {
s = encodeURIComponent(s);
return s.replace(/~/g,'%7E').replace(/%20/g,'+');
}

// sample usage: suppose form has text input fields for
// country, postcode, and city with id='country' and so-on.
// We'll use GET to send values of country and postcode
// to "city_lookup.php" asynchronously, then update city
// field in form with the reply (from database lookup)

function lookup_city() {
var elm_country = document.getElementById('country');
var elm_zip = document.getElementById('postcode');
var elm_city = document.getElementById('city');
var qry = '?country=' + urlencode(elm_country.value) +
'&postcode=' + urlencode(elm_zip.value);
var xhr;
try {
xhr = new XMLHttpRequest(); // recent browsers
} catch (e) {
alert('No XMLHttpRequest!');
return;
}
xhr.open('GET',('city_lookup.php'+qry),true);
xhr.onreadystatechange = function(){
if ((xhr.readyState != 4) || (xhr.status != 200)) return;
elm_city.value = xhr.responseText;
}
xhr.send(null);
}
</script>

******/
?>
-16
homebot at yandex dot ru
11 年前
用于数组 URL 编码的简单静态类

[code]

<?php

/**
*
* URL 编码类
* 使用方法: urlencode_array::go() 作为函数
*
*/
class urlencode_array
{

/** 主要编码工作
* @param string $perfix
* @param array $array
* @param string $ret byref 将记录推送到返回数组中
* @param mixed $fe 是否是函数的第一次调用?
*/
private static function encode_part($perfix, $array, &$ret, $fe = false)
{
foreach (
$array as $k => $v )
{
switch (
gettype($v))
{
case
'float' :
case
'integer' :
case
'string' : $ret [ $fe ? $k : $perfix.'['.$k.']' ] = $v; break;
case
'boolean' : $ret [ $fe ? $k : $perfix.'['.$k.']' ] = ( $v ? '1' : '0' ); break;
case
'null' : $ret [ $fe ? $k : $perfix.'['.$k.']' ] = 'NULL'; break;
case
'object' : $v = (array) $v;
case
'array' : self::encode_part( $fe?$perfix.$k:$perfix.'['.$k.']' , $v, $ret, false); break;
}
}
}

/** UrlEncode 数组
* @param mixed $array 要编码的数组或 stdClass
* @returns string 作为 'application/x-www-form-urlencoded' 发送的字符串
*/
public static function go($array)
{
$buff = array();
if (
gettype($array) == 'object') $array = (array) $array;
self::encode_part('', $array, $buff, true);
$retn = '';
foreach (
$buff as $k => $v )
$retn .= urlencode($k) . '=' . urlencode($v) . '&';
return
$retn;
}
}

#-------------------------------- 测试区域 ------------------------------------

$buffer = array(
'master' =>'master.zenith.lv',
'join' =>array('slave'=>'slave1.zenith.lv','slave2'=>array('node1.slave2.zenith.lv','slave2.zenith.lv')),
'config' => new stdClass()
);
$buffer['config']->MaxServerLoad = 200;
$buffer['config']->MaxSlaveLoad = 100;
$buffer['config']->DropUserNoWait = true;

$buffer = urlencode_array::go($buffer);
parse_str( $buffer , $data_decoded);

header('Content-Type: text/plain; charset=utf-8');
echo
'编码后的字符串 :' . str_repeat('-', 80) . "\n";
echo
$buffer;
echo
str_repeat("\n", 3) . 'PHP 解码后的字符串 :' . str_repeat('-', 80) . "\n";
print_r($data_decoded);

[/
code]
-12
nehuensd at gmail dot com
10年前
如果您有这样的 URL:test-blablabla-4>3-y-3<6 或包含任何排除的 US-ASCII 字符(请参见 http://www.ietf.org/rfc/rfc2396.txt 中的第 2.4.3 章),您可以使用两次 urlencode 来修复 403 错误。

示例
.htaccess
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^test-(.*)$ index.php?token=$1

index.php
<?php
var_dump
($_GET);

$foo = 'test-bla-bla-4>2-y-3<6';
$foo_encoded = urlencode(urlencode($foo));
?>
<a href="<?=$foo_encoded;?>"><?=$foo_encoded;?></a>

查看 index.php
array (size=0)

test-bla-bla-4%253E2-y-3%253C6

查看 test-bla-bla-4%253E2-y-3%253C6
array (size=1)
'token' => string 'bla-bla-4>2-y-3<6' (length=17)
test-bla-bla-4%253E2-y-3%253C6

问题在于这些字符被解码了两次,第一次是 mod_rewrite,第二次是创建 PHP $ _GET 数组。

此外,您也可以使用这种技术来代替其他笔记中的复杂函数。
To Top