Я создаю страницу поиска, где вы вводите поисковый запрос, и форма отправляется search.php?query=your query. Какая функция PHP является лучшей и которую я должен использовать для кодирования / декодирования поискового запроса?
У вас возникли проблемы? Браузеры и PHP уже должны обрабатывать это автоматически (например, вставляя foo barтекстовое поле, создается foo+barв URL-адресе).
Феликс Клинг,
@Felix Я собираюсь вызвать скрипт поисковика, используяfile_get_contents
application / x-www-form-urlencoded - это просто специальный вариант Percent-Encoding, который применяется только для кодирования данных HTML-формы.
Gumbo
1
@ Click Upvote: их нельзя сравнивать таким образом. Формат application / x-www-form-urlencoded - это формат Percent-Encoding , за исключением того, что пробел кодируется с помощью +вместо %20. Кроме того, application / x-www-form-urlencoded используется для кодирования данных формы, тогда как Percent-Encoding имеет более общее применение.
Gumbo
12
rawurlencode () совместит с яваскриптом decodeURI () функцией
Клайв Патерсон
Всегда ли это правило эмпирическое? Я имею в виду, что когда мне нужно закодировать строку запроса, я всегда использую urldecode. Тогда как насчет пути URI (например /a/path with spaces/) и фрагмента URI (например #fragment). Должен ли я всегда использовать rawurldecodeдля этих двоих?
tonix
Хорошее практическое правило: пути (Like / my% 20folder /) идут с rawurlencode; но для полей POST и GET используйте urlencode(Like /? folder = my + folder) `
не могли бы вы объяснить, почему urldecode () не следует использовать с $ _POST. потому что я занимаюсь этим с давних пор без каких-либо проблем.
sid
мне нужно кодировать основные параметры (например "name=b&age=c&location=d"), отправленные в файл PHP через AJAX?
oldboy
9
Вот мой вариант использования, который требует исключительного количества кодирования. Возможно, вы думаете, что это надумано, но мы запускаем это на производстве. По совпадению, это охватывает все типы кодирования, поэтому я публикую в качестве учебного пособия.
Описание варианта использования
Кто-то только что купил предоплаченную подарочную карту («жетон») на нашем сайте. У токенов есть соответствующие URL-адреса для их погашения. Этот клиент хочет отправить 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 ='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 with that mailto link
echo '<a href="'. htmlspecialchars($mailToUri).'">Email your friend</a>';
Примечание: вышесказанное предполагает, что вы выполняете вывод в text/htmlдокумент. Если ваш тип выходного носителя - text/jsonпросто используйте, $retval['url'] = $mailToUri;потому что выходное кодирование обрабатывается json_encode().
Прецедент
Запустите код на тестовом сайте PHP ( есть ли канонический, который я должен здесь упомянуть? )
Эквивалентно и менее семантически (потому что mailto:это не HTTP) вы можете использовать $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);.
Уильям Энтрикен
0
Вы можете использовать функции кодирования URL-адресов. PHP имеет
В зависимости от того, какой тип стандартной кодировки RFC вы хотите выполнить или если вам нужно настроить кодировку, вы можете создать свой собственный класс.
/**
* UrlEncoder make it easy to encode your URL
*/classUrlEncoder{publicconst STANDARD_RFC1738 =1;publicconst STANDARD_RFC3986 =2;publicconst STANDARD_CUSTOM_RFC3986_ISH =3;// add more herestaticfunction encode($string, $rfc){switch($rfc){caseself::STANDARD_RFC1738:return urlencode($string);break;caseself::STANDARD_RFC3986:return rawurlencode($string);break;caseself::STANDARD_CUSTOM_RFC3986_ISH:// Add your custom encoding
$entities =['%21','%2A','%27','%28','%29','%3B','%3A','%40','%26','%3D','%2B','%24','%2C','%2F','%3F','%25','%23','%5B','%5D'];
$replacements =['!','*',"'","(",")",";",":","@","&","=","+","$",",","/","?","%","#","[","]"];return str_replace($entities, $replacements, urlencode($string));break;default:thrownewException("Invalid RFC encoder - See class const for reference");break;}}}
Пример использования:
$dataString ="https://www.google.pl/search?q=PHP is **great**!&id=123&css=#kolo&email=me@liszka.com)";
$dataStringUrlEncodedRFC1738 =UrlEncoder::encode($dataString,UrlEncoder::STANDARD_RFC1738);
$dataStringUrlEncodedRFC3986 =UrlEncoder::encode($dataString,UrlEncoder::STANDARD_RFC3986);
$dataStringUrlEncodedCutom =UrlEncoder::encode($dataString,UrlEncoder::STANDARD_CUSTOM_RFC3986_ISH);
foo bar
текстовое поле, создаетсяfoo+bar
в URL-адресе).file_get_contents
Ответы:
Для запроса URI используйте
urlencode
/urldecode
; для чего-нибудь еще используйтеrawurlencode
/rawurldecode
.Разница между
urlencode
и вrawurlencode
том, чтоurlencode
кодируется в соответствии с application / x-www-form-urlencoded (пробел кодируется+
), аrawurlencode
кодируется в соответствии с простым Percent-Encoding (пробел кодируется%20
).источник
+
вместо%20
. Кроме того, application / x-www-form-urlencoded используется для кодирования данных формы, тогда как Percent-Encoding имеет более общее применение.urldecode
. Тогда как насчет пути URI (например/a/path with spaces/
) и фрагмента URI (например#fragment
). Должен ли я всегда использоватьrawurldecode
для этих двоих?rawurlencode
; но для полей POST и GET используйтеurlencode
(Like /? folder = my + folder) `Хитроумно названные urlencode () и urldecode () .
Однако вам не нужно использовать
urldecode()
переменные, которые появляются в$_POST
и$_GET
.источник
"name=b&age=c&location=d"
), отправленные в файл PHP через AJAX?Вот мой вариант использования, который требует исключительного количества кодирования. Возможно, вы думаете, что это надумано, но мы запускаем это на производстве. По совпадению, это охватывает все типы кодирования, поэтому я публикую в качестве учебного пособия.
Описание варианта использования
Кто-то только что купил предоплаченную подарочную карту («жетон») на нашем сайте. У токенов есть соответствующие URL-адреса для их погашения. Этот клиент хочет отправить URL кому-нибудь по электронной почте. На нашей веб-странице есть
mailto
ссылка, которая позволяет им это сделать.Код PHP
Примечание: вышесказанное предполагает, что вы выполняете вывод в
text/html
документ. Если ваш тип выходного носителя -text/json
просто используйте,$retval['url'] = $mailToUri;
потому что выходное кодирование обрабатываетсяjson_encode()
.Прецедент
Тебе следует увидеть:
И, конечно же, это JSON-представление
$token
выше.источник
mailto:
это не HTTP) вы можете использовать$mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);
.Вы можете использовать функции кодирования URL-адресов. PHP имеет
функция
ASP имеет
функция
В JavaScript вы можете использовать
функция.
источник
В зависимости от того, какой тип стандартной кодировки RFC вы хотите выполнить или если вам нужно настроить кодировку, вы можете создать свой собственный класс.
Пример использования:
Выведет:
* Узнайте больше о стандартах RFC: https://datatracker.ietf.org/doc/rfc3986/ и urlencode vs rawurlencode?
источник