Come codificare correttamente una stringa in PHP con l'URL?


97

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?


2
Hai problemi? Browser e PHP dovrebbero già gestirlo automaticamente (ad esempio, inserendo foo barun campo di testo, creando foo+barnell'URL).
Felix Kling

@Felix Vado a chiamare lo script del ricercatore usandofile_get_contents
Fai clic su Upvote

Risposte:


183

Per la query URI utilizzare urlencode/ urldecode; per qualsiasi altra cosa usa rawurlencode/ rawurldecode.

La differenza tra urlencodee rawurlencodeè quella


application / x-www-form-urlencoded è solo una variante speciale della codifica percentuale e viene applicata solo per codificare i dati del modulo HTML.
Gumbo

1
@Click Upvote: non possono essere confrontati in questo modo. Il formato application / x-www-form-urlencoded è il formato Percent-Encoding tranne per il fatto che lo spazio è codificato con +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.
Gumbo

12
rawurlencode () è compatibile con javascript decodeURI () funzione
Clive Paterson

Questa regola è sempre empirica? Voglio dire, quando ho bisogno di codificare una stringa di query che uso sempre urldecode. Allora, che dire del percorso URI (ad esempio /a/path with spaces/) e del frammento URI (ad esempio #fragment). Dovrei usare sempre rawurldecodeper questi due?
tonix

Una buona regola pratica è che per i percorsi (Like / my% 20folder /) vanno con rawurlencode; ma per i campi POST e GET vai con urlencode(Like /? folder = my + folder) `
Soroush Falahati

22

I nomi astuti urlencode () e urldecode () .

Tuttavia, non dovrebbe essere necessario utilizzare urldecode()sulle variabili che appaiono in $_POSTe $_GET.


4
potresti spiegare perché urldecode () non dovrebbe essere usato con $ _POST. perché lo faccio da secoli senza problemi.
sid

"name=b&age=c&location=d"devo codificare i parametri di base (ad esempio ) inviati a un file PHP tramite AJAX?
oldboy

9

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.

Descrizione del caso d'uso

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 mailtocollegamento che gli consente di farlo.

Codice 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>';

Nota: quanto sopra presuppone che si stia eseguendo l'output su un text/htmldocumento. Se il tuo tipo di supporto di output è text/jsonquindi usalo semplicemente $retval['url'] = $mailToUri;perché la codifica di output è gestita da json_encode().

Scenario di prova

  1. Esegui il codice su un sito di test PHP ( ce n'è uno canonico che dovrei menzionare qui? )
  2. Clicca il link
  3. Invia l'email
  4. Ricevi l'e-mail
  5. Fare clic su quel collegamento

Tu dovresti vedere:

"args": {
  "token": "w%a&!e#\"^2(^@azW"
}, 

E ovviamente questa è la rappresentazione JSON di cui $tokensopra.


In modo equivalente, e meno semanticamente (perché mailto:non è HTTP), puoi usare $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);.
William Entriken

0

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.


0

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?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.