(PHP 4, PHP 5, PHP 7, PHP 8)
urlencode — Кодирует строку для безопасного включения в структуру URL-адреса
Функцией часто кодируют часть 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&bar=Not+the+same+content+as+Data123%21%40-_+%2B">
Замечание:
С PHP-переменными, значения которых совпадают с HTML-сущностями, работают осторожно. При разборе HTML-разметки браузер анализирует последовательности символов наподобие &, © и £ и преобразовывает именованные сущности в символы, которыми заменяет названия переменных в URI-идентификаторе. Это насущная проблема, о которой консорциум W3C рассказывает много лет. Подробнее об обработке символа амперсанда рассказывает страница: » http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2.
PHP поддерживает изменение разделителя аргументов URL-адресов на «точку с запятой», которую предложил W3C, через ini-директивы arg_separator. Бо́льшая часть пользовательских агентов не отправляет данные формы в формате с разделителем «точка с запятой». Поэтому в URL-адресах HTML-разметки лучше указывать разделитель &, а не &, чтобы обойти проблему несогласованной обработки URL-адресов. Для этого не потребуется изменять PHP-директивы arg_separator. При разделении аргументов символом & URL-адреса кодируют функциями htmlentities() или htmlspecialchars() .
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));
}
?>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}";
}
```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));
}
?>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().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.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.