PHP 8.4.2 Released!

urlencode

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

urlencodeURL-кодирует строку

Описание

urlencode(string $string): string

Функция кодирует строку, которая будет использоваться в части запроса URL-адреса, что упрощает передачу переменных на следующую страницу.

Список параметров

string

Строка, которая будет закодирована.

Возвращаемые значения

Функция возвращает строку, в которой символы, кроме буквенно-цифровых и -_., были заменены знаком процента (%), за которым следует два шестнадцатеричных числа, а пробелы закодированы как знак сложения (+). Строка кодируется тем же способом, что и POST-данные веб-формы, то есть по типу контента application/x-www-form-urlencoded. Это отличается от кодирования по стандарту » RFC 3986 (смотрите описание функции rawurlencode() ) тем, что по историческим причинам пробелы кодируются как знак «плюс» (+).

Примеры

Пример #1 Пример использования функции urlencode()

<?php

$userinput
= 'Data123!@-_ +';
echo
"Пользовательские данные: $userinput\n";
echo
'<a href="mycgi?foo=', urlencode($userinput), '">';

?>

Результат выполнения приведённого примера:

Пользовательские данные: Data123!@-_ +
<a href="mycgi?foo=Data123%21%40-_+%2B">

Пример #2 Пример использования функций urlencode() и htmlentities()

<?php

$foo
= 'Data123!@-_ +';
$bar = "Содержание, которое отличается от значения $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: Содержание, которое отличается от значения 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 поддерживает изменение разделителя аргументов на «точку с запятой», которую предложил W3C, через ini-директиву arg_separator. К сожалению, бо́льшая часть пользовательских агентов не отправляют данные формы в формате, разделённые «точкой с запятой». Более переносимый способ обойти проблему — использовать разделитель &amp; вместо &. Не нужно для этого изменять PHP-директиву arg_separator. Оставьте разделитель &, но кодируйте URL-адрес функциями htmlentities() или htmlspecialchars().

Смотрите также

  • urldecode() - Декодирование URL-кодированной строки
  • htmlentities() - Преобразовывает возможные символы в HTML-сущности
  • rawurlencode() - URL-кодирование строки согласно RFC 3986
  • rawurldecode() - Декодирование URL-кодированной строки
  • » RFC 3986

Добавить

Примечания пользователей 6 notes

up
66
davis dot peixoto at gmail dot com
14 years ago
urlencode function and rawurlencode are mostly based on RFC 1738.

However, since 2005 the current RFC in use for URIs standard is RFC 3986.

Here is a function to encode URLs according to RFC 3986.

<?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));
}
?>
up
9
temu92 at gmail dot com
15 years ago
I needed encoding and decoding for UTF8 urls, I came up with these very simple fuctions. Hope this helps!

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

function
url_decode($string){
return
utf8_decode(urldecode($string));
}
?>
up
1
materialsmoke at gmail dot com
1 year ago
this function will encode the URL while preserving the functionality of URL so you can copy and paste it in the browser
```
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}";
}
```
up
8
daniel+php at danielnorton dot com
15 years ago
Don't use urlencode() or urldecode() if the text includes an email address, as it destroys the "+" character, a perfectly valid email address character.

Unless you're certain that you won't be encoding email addresses AND you need the readability provided by the non-standard "+" usage, instead always use use rawurlencode() or rawurldecode().
up
8
omid at omidsakhi dot com
14 years ago
I needed a function in PHP to do the same job as the complete escape function in Javascript. It took me some time not to find it. But findaly I decided to write my own code. So just to save time:

<?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;
}
?>

It can be fully decoded using the unscape function in Javascript.
up
1
ahrensberg at gmail dot com
17 years ago
Like "Benjamin dot Bruno at web dot de" earlier has writen, you can have problems with encode strings with special characters to flash. Benjamin write that:

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

... could do the problem. Unfortunately flash still have problems with read some quotations, but with this one:

<?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;
}
?>

... should solve this problem.
To Top