PHP 8.5.0 Beta 2 available for testing

urlencode

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

urlencodeКодирует строку для безопасного включения в структуру URL-адреса

Описание

urlencode(string $string): string

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

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

string

Строка для кодирования.

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

Функция возвращает строку в которой каждый символ, кроме буквенно-цифровых и -_., заменила знаком процента (%), за которым следует два шестнадцатеричных числа, а пробелы закодировала знаком +. Строка кодируется аналогично данным при отправке веб-формы с типом контента 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">

Примечания

Замечание:

С PHP-переменными, значения которых совпадают с HTML-сущностями, работают осторожно. При разборе HTML-разметки браузер анализирует последовательности символов наподобие &amp, &copy и &pound и преобразовывает именованные сущности в символы, которыми заменяет названия переменных в URI-идентификаторе. Это насущная проблема, о которой консорциум W3C рассказывает много лет. Подробнее об обработке символа амперсанда рассказывает страница: » http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2.

PHP поддерживает изменение разделителя аргументов URL-адресов на «точку с запятой», которую предложил W3C, через ini-директивы arg_separator. Бо́льшая часть пользовательских агентов не отправляет данные формы в формате с разделителем «точка с запятой». Поэтому в URL-адресах HTML-разметки лучше указывать разделитель &amp;, а не &, чтобы обойти проблему несогласованной обработки URL-адресов. Для этого не потребуется изменять 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
15 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
16 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
2 years 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
16 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
15 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
18 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