Я роблю сторінку пошуку, де ви вводите пошуковий запит і форма подається 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 (пробіл кодується за допомогою +
) whilerawurlencode
кодує відповідно до простого кодування відсотків (пробіл кодується за допомогою %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 проти rawurlencode?
foo bar
текстового поля, створенняfoo+bar
URL-адреси).