Urlencode: примеры (PHP)
urlencode(string string): stringФункция urlencode в PHP
Функция urlencode выполняет кодирование строки для безопасного использования в URL. Она преобразует специальные символы и символы с пробелами в формат, понятный для передачи через интернет. Использование этой функции актуально при формировании параметров запроса в URL адресах, например, при создании ссылок с GET параметрами.
Функция принимает один обязательный параметр:
- string - строка, которая требует кодирования для включения в состав URL.
Функция возвращает строку, в которой все небуквенно-цифровые символы, кроме дефиса, подчеркивания и точки, заменены знаком процента и двумя шестнадцатеричными цифрами. Пробелы кодируются как знак плюс (+).
Примеры использования urlencode
<?
echo urlencode('Привет мир!');
?>%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82+%D0%BC%D0%B8%D1%80%21
<?
echo urlencode('price=$100&discount=15%');
?>price%3D%24100%26discount%3D15%25
<?
echo 'https://example.com/search?q=' . urlencode('кофе и чай');
?>https://example.com/search?q=%D0%BA%D0%BE%D1%84%D0%B5+%D0%B8+%D1%87%D0%B0%D0%B9
Похожие функции в PHP
rawurlencode - выполняет кодирование согласно стандарту RFC 3986. В отличие от urlencode, пробел кодируется как %20 вместо знака плюс. Предпочтительнее для кодирования частей пути URL.
http_build_query - генерирует строку запроса URL из массива параметров. Автоматически применяет кодирование к ключам и значениям. Удобно для построения сложных запросов.
htmlspecialchars - экранирует специальные символы HTML. Используется для защиты от XSS атак при выводе данных в HTML, а не для кодирования URL.
Аналоги функции в других языках
Urlencode в Python
import urllib.parse
print(urllib.parse.quote('Привет мир!', encoding='utf-8'))%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80%21
Функция quote кодирует пробел как %20. Для аналога urlencode с плюсом используют quote_plus.
Urlencode в Javascript
console.log(encodeURIComponent('Привет мир!'));%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80!
encodeURIComponent также кодирует пробел как %20. Кодирует больше символов, чем PHP функция.
Urlencode в MySQL
SELECT ENCODE('Привет мир!', 'base64'); -- не прямой аналогВ MySQL нет прямой аналогичной функции. Рекомендуется выполнять кодирование на стороне приложения.
Типичные ошибки
<?
$str = 'data 123';
$encoded = urlencode(urlencode($str));
echo $encoded;
?>data%2B123
При двойном кодировании знак плюс из первого кодирования трактуется как обычный символ и кодируется повторно.
<?
echo urlencode('https://example.com/page?param=value');
?>https%3A%2F%2Fexample.com%2Fpage%3Fparam%3Dvalue
Функция не предназначена для кодирования целых URL, только для их частей. Это делает ссылку нерабочей.
<?
$params = ['name' => 'John Doe', 'city' => 'New York'];
$url = 'https://example.com?' . urlencode($params);
echo $url;
?>https://example.com?Array
При передаче массива функция преобразует его в строку 'Array'. Для кодирования параметров нужно использовать http_build_query.
Изменения в последних версиях PHP
В PHP 8.1.0 было изменено поведение при передаче значения null аргументу функции. Теперь это вызывает ошибку типа TypeError. Ранее значение null преобразовывалось в пустую строку.
<?
// PHP 8.0 и ранее
echo urlencode(null); // ''
// PHP 8.1 и новее
// echo urlencode(null); // TypeError
?>Расширенные примеры
<?
$data = [
'user' => [
'name' => 'Иван Петров',
'preferences' => ['lang' => 'ru', 'theme' => 'dark']
],
'action' => 'save'
];
$query = http_build_query($data);
echo 'https://api.example.com?' . $query;
?>https://api.example.com?user%5Bname%5D=%D0%98%D0%B2%D0%B0%D0%BD+%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2&user%5Bpreferences%5D%5Blang%5D=ru&user%5Bpreferences%5D%5Btheme%5D=dark&action=save
<?
$domain = 'пример.рф';
$encoded = urlencode($domain);
echo 'https://' . $encoded . '/page';
?>https://%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80.%D1%80%D1%84/page
Для интернационализованных доменных имен следует использовать функцию idn_to_ascii.
<?
$postData = [
'title' => 'Статья о PHP',
'content' => 'Содержание с & и = символами',
'tags' => 'php,web,development'
];
$encodedData = '';
foreach ($postData as $key => $value) {
$encodedData .= $key . '=' . urlencode($value) . '&';
}
$encodedData = rtrim($encodedData, '&');
echo $encodedData;
?>title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F+%D0%BE+PHP&content=%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5+%D1%81+%26+%D0%B8+%3D+%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0%D0%BC%D0%B8&tags=php%2Cweb%2Cdevelopment
<?
$str = 'пробел и plus';
echo 'urlencode: ' . urlencode($str) . "\n";
echo 'rawurlencode: ' . rawurlencode($str);
?>urlencode: %D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB+%D0%B8+plus rawurlencode: %D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%20%D0%B8%20plus