Я создаю страницу поиска, где вы вводите поисковый запрос, и форма отправляется search.php?query=your query
. Какая функция PHP является лучшей и которую я должен использовать для кодирования / декодирования поискового запроса?
file_get_contents
Я создаю страницу поиска, где вы вводите поисковый запрос, и форма отправляется search.php?query=your query
. Какая функция PHP является лучшей и которую я должен использовать для кодирования / декодирования поискового запроса?
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
ссылка, которая позволяет им это сделать.
// 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()
.
Тебе следует увидеть:
"args": {
"token": "w%a&!e#\"^2(^@azW"
},
И, конечно же, это JSON-представление $token
выше.
mailto:
это не HTTP) вы можете использовать $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);
.
Вы можете использовать функции кодирования URL-адресов. PHP имеет
rawurlencode()
функция
ASP имеет
Server.URLEncode()
функция
В JavaScript вы можете использовать
encodeURIComponent()
функция.
В зависимости от того, какой тип стандартной кодировки RFC вы хотите выполнить или если вам нужно настроить кодировку, вы можете создать свой собственный класс.
/**
* UrlEncoder make it easy to encode your URL
*/
class UrlEncoder{
public const STANDARD_RFC1738 = 1;
public const STANDARD_RFC3986 = 2;
public const STANDARD_CUSTOM_RFC3986_ISH = 3;
// add more here
static function encode($string, $rfc){
switch ($rfc) {
case self::STANDARD_RFC1738:
return urlencode($string);
break;
case self::STANDARD_RFC3986:
return rawurlencode($string);
break;
case self::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:
throw new Exception("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);
Выведет:
string(126) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP+is+%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(130) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP%20is%20%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(86) "https://www.google.pl/search?q=PHP+is+**great**!&id=123&css=#kolo&email=me@liszka.com)"
* Узнайте больше о стандартах RFC: https://datatracker.ietf.org/doc/rfc3986/ и urlencode vs rawurlencode?
foo bar
текстовое поле, создаетсяfoo+bar
в URL-адресе).