2011-01-20 2 views
61

Я делаю страницу поиска, на которой вы вводите поисковый запрос, и форма отправляется в search.php?query=your query. Какая функция PHP является лучшей и что я должен использовать для кодирования/декодирования поискового запроса?Как правильно URL кодировать строку в PHP?

+2

У вас возникли проблемы? Браузеры и PHP должны обрабатывать это автоматически уже (например, помещая 'foo bar' в текстовое поле, создавая' foo + bar' в URL-адресе). –

+0

@Felix Я собираюсь вызвать скрипт искателя, используя 'file_get_contents' –

ответ

108

Для запроса URI используйте urlencode/urldecode; для чего-либо еще используйте rawurlencode/rawurldecode.

Разница между urlencode и rawurlencode является то, что

  • urlencode кодирует согласно application/x-www-form-urlencoded (пробел кодируется с +), тогда как
  • rawurlencode кодирует в соответствии с обычной Percent-Encoding (пробел кодируется %20).
+0

* application/x-www-form-urlencoded * - это просто специальный вариант * Процент-кодирование * и применяется только для кодирования данных формы HTML. – Gumbo

+0

Какая кодировка лучше, форма-urlencoded или процентов? –

+1

@Click Upvote: Их нельзя сравнивать таким образом. Формат * application/x-www-form-urlencoded * * * * Формат Percent-Encoding *, за исключением того, что пространство кодируется с помощью '+' вместо '% 20'. Кроме того, * application/x-www-form-urlencoded * используется для кодирования данных формы, в то время как * Percent-Encoding * имеет более общее использование. – Gumbo

14

Хитроумно названные urlencode() и urldecode().

Однако вам не нужно использовать urldecode() для переменных, которые отображаются в $_POST и $_GET.

+3

Условно-называемый' rawurlencode' и 'rawurldecode' ... –

2

Вот мой прецедент, требующий исключительного количества кодирования. Может быть, вы думаете, что это надуло, но мы это делаем на производстве. Совпадение, это охватывает все типы кодирования, поэтому я отправляю в качестве учебника.

Пример использования Описание

Кто-то только что купил предоплаченные подарочные карты («маркер») на нашем сайте. У токенов есть соответствующие URL-адреса, чтобы их выкупить. Этот клиент хочет отправить его кому-то другому. Наша веб-страница содержит ссылку mailto, которая позволяет им это делать.

PHP код

// The order system generates some opaque token 
$token = 'w%a&!e#"^2(^@azW'; 

// Here is a URL to redeem that token 
$redeemUrl = 'https://httpbin.org/get?token=' . urlencode($token); 

// Actual contents we want for the email 
$subject = 'I just bought this for you'; 
$body = 'I just bought a widget for you. Please enter your shipping details here: ' . $redeemUrl; 

// A URI for the email as prescribed 
$mailToUri = 'mailto:?subject=' . rawurlencode($subject) . '&body=' . rawurlencode($body); 

// Print an HTML element that links to that page 
echo '<a href="' . htmlspecialchars($mailToUri) . '">Email your friend</a>'; 

Примечание: выше предполагает, что вы вывода на text/html документа. Если тип выходного носителя равен text/json, просто используйте $retval['url'] = $mailToUri;, потому что выходное кодирование обрабатывается json_encode().

Тестовый случай

  1. Выполнить код на тестовом PHP сайте (есть канонический один я должен упомянуть здесь?)
  2. Нажмите на ссылку
  3. Отправить письмо
  4. Получить электронное письмо
  5. Нажмите эту ссылку

Вы должны увидеть:

"args": { 
    "token": "w%a&!e#\"^2(^@azW" 
}, 

И, конечно, это представление JSON из $token выше.

Смежные вопросы