Robię stronę wyszukiwania, na której wpisujesz zapytanie i formularz jest przesyłany search.php?query=your query
. Jaka funkcja PHP jest najlepsza i której powinienem używać do kodowania / dekodowania zapytania wyszukiwania?
file_get_contents
Robię stronę wyszukiwania, na której wpisujesz zapytanie i formularz jest przesyłany search.php?query=your query
. Jaka funkcja PHP jest najlepsza i której powinienem używać do kodowania / dekodowania zapytania wyszukiwania?
file_get_contents
Odpowiedzi:
W przypadku zapytania URI użyj urlencode
/ urldecode
; do czegokolwiek innego użyj rawurlencode
/ rawurldecode
.
Różnica między urlencode
i rawurlencode
jest taka
urlencode
koduje zgodnie z application / x-www-form-urlencoded (spacja jest kodowana za pomocą +
) whilerawurlencode
koduje zgodnie ze zwykłym kodowaniem procentowym (spacja jest zakodowana %20
).+
zamiast %20
. Poza tym application / x-www-form-urlencoded jest używany do kodowania danych formularza, podczas gdy kodowanie procentowe ma bardziej ogólne zastosowanie.
urldecode
. A co ze ścieżką URI (np. /a/path with spaces/
) I fragmentem URI (np #fragment
.). Czy powinienem zawsze używać rawurldecode
dla tych dwóch?
rawurlencode
; ale dla pól POST i GET idź z urlencode
(Like /? folder = my + folder) `
Sprytnie nazwane urlencode () i urldecode () .
Jednak nie powinieneś używać urldecode()
na zmiennych, które pojawiają się w $_POST
i $_GET
.
"name=b&age=c&location=d"
) przesłane do pliku PHP przez AJAX?
Oto mój przypadek użycia, który wymaga wyjątkowej ilości kodowania. Może myślisz, że to wymyślone, ale uruchamiamy to na produkcji. Tak się składa, że dotyczy to każdego typu kodowania, więc publikuję jako samouczek.
Ktoś właśnie kupił przedpłaconą kartę podarunkową („token”) w naszej witrynie. Tokeny mają odpowiadające im adresy URL umożliwiające ich wykorzystanie. Ten klient chce wysłać adres URL do kogoś innego. Nasza strona internetowa zawiera mailto
łącze, które im to umożliwia.
// 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>';
Uwaga: powyższe zakłada, że drukujesz do text/html
dokumentu. Jeśli typ nośnika wyjściowego jest text/json
po prostu użyj, $retval['url'] = $mailToUri;
ponieważ kodowanie wyjściowe jest obsługiwane przez json_encode()
.
Powinieneś zobaczyć:
"args": {
"token": "w%a&!e#\"^2(^@azW"
},
I oczywiście jest to reprezentacja JSON $token
powyżej.
mailto:
nie jest HTTP), możesz użyć $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);
.
Możesz użyć funkcji kodowania adresów URL PHP ma rozszerzenie
rawurlencode()
funkcjonować
ASP ma
Server.URLEncode()
funkcjonować
W JavaScript możesz użyć
encodeURIComponent()
funkcjonować.
W oparciu o typ standardowego kodowania RFC, które chcesz wykonać, lub jeśli chcesz dostosować kodowanie, możesz utworzyć własną klasę.
/**
* 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;
}
}
}
Użyj przykładu:
$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);
Wyświetli:
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)"
* Dowiedz się więcej o standardach RFC: https://datatracker.ietf.org/doc/rfc3986/ i urlencode vs rawurlencode?
foo bar
pole tekstowe, tworzyfoo+bar
w adresie URL).