Sto creando una pagina di ricerca, in cui digiti una query di ricerca e il modulo viene inviato search.php?query=your query
. Quale funzione PHP è la migliore e che dovrei usare per codificare / decodificare la query di ricerca?
file_get_contents
Sto creando una pagina di ricerca, in cui digiti una query di ricerca e il modulo viene inviato search.php?query=your query
. Quale funzione PHP è la migliore e che dovrei usare per codificare / decodificare la query di ricerca?
file_get_contents
Risposte:
Per la query URI utilizzare urlencode
/ urldecode
; per qualsiasi altra cosa usa rawurlencode
/ rawurldecode
.
La differenza tra urlencode
e rawurlencode
è quella
urlencode
codifica secondo application / x-www-form-urlencoded (lo spazio è codificato con +
) whilerawurlencode
codifica secondo la semplice codifica percentuale (lo spazio è codificato con %20
).+
invece di %20
. E oltre a ciò, application / x-www-form-urlencoded viene utilizzato per codificare i dati del modulo mentre Percent-Encoding ha un utilizzo più generale.
urldecode
. Allora, che dire del percorso URI (ad esempio /a/path with spaces/
) e del frammento URI (ad esempio #fragment
). Dovrei usare sempre rawurldecode
per questi due?
rawurlencode
; ma per i campi POST e GET vai con urlencode
(Like /? folder = my + folder) `
I nomi astuti urlencode () e urldecode () .
Tuttavia, non dovrebbe essere necessario utilizzare urldecode()
sulle variabili che appaiono in $_POST
e $_GET
.
"name=b&age=c&location=d"
devo codificare i parametri di base (ad esempio ) inviati a un file PHP tramite AJAX?
Ecco il mio caso d'uso, che richiede una quantità eccezionale di codifica. Forse pensi che sia artificioso, ma lo facciamo funzionare in produzione. Per coincidenza, questo copre ogni tipo di codifica, quindi sto postando come tutorial.
Qualcuno ha appena acquistato una carta regalo prepagata ("gettone") sul nostro sito web. I token hanno URL corrispondenti per riscattarli. Questo cliente desidera inviare l'URL tramite email a qualcun altro. La nostra pagina web include un mailto
collegamento che gli consente di farlo.
// 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>';
Nota: quanto sopra presuppone che si stia eseguendo l'output su un text/html
documento. Se il tuo tipo di supporto di output è text/json
quindi usalo semplicemente $retval['url'] = $mailToUri;
perché la codifica di output è gestita da json_encode()
.
Tu dovresti vedere:
"args": {
"token": "w%a&!e#\"^2(^@azW"
},
E ovviamente questa è la rappresentazione JSON di cui $token
sopra.
mailto:
non è HTTP), puoi usare $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);
.
Puoi utilizzare le funzioni di codifica URL PHP ha l'estensione
rawurlencode()
funzione
ASP ha l'estensione
Server.URLEncode()
funzione
In JavaScript puoi usare il
encodeURIComponent()
funzione.
In base al tipo di codifica standard RFC che desideri eseguire o se devi personalizzare la codifica, potresti voler creare la tua classe.
/**
* 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;
}
}
}
Esempio di utilizzo:
$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);
Produrrà:
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)"
* Scopri di più sugli standard RFC: https://datatracker.ietf.org/doc/rfc3986/ e urlencode vs rawurlencode?
foo bar
un campo di testo, creandofoo+bar
nell'URL).