2011-02-08 6 views
19

Esiste qualche funzione encodeURI() in PHP che non codifica: [email protected]#$&*()=:/,;?+'?encodeURI() in PHP?

+0

Quindi, quali caratteri * non * si vuole codificare? –

+1

potresti dover personalizzare qui e decodificare i caratteri che desideri conservare, se questo è un elenco breve – zanlok

risposta

29

Sto usando questo ora

function encodeURI($url) { 
    // http://php.net/manual/en/function.rawurlencode.php 
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI 
    $unescaped = array(
     '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~', 
     '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')' 
    ); 
    $reserved = array(
     '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':', 
     '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$' 
    ); 
    $score = array(
     '%23'=>'#' 
    ); 
    return strtr(rawurlencode($url), array_merge($reserved,$unescaped,$score)); 

} 

E rawurlencodes praticamente tutto, e quindi decodifica alcune cose indietro (come Zanlok suggerito nel suo commento). Questo dovrebbe essere conforme alle specifiche Mozilla di encodeURI.

+0

Davvero utile ... –

+1

Puoi aggiungere ''% 5B' => '[', '% 5D '=>'] ''ai caratteri riservati che devono corrispondere a RFC3986 (parentesi IPV6) – mems

+0

@mems, grazie per il suggerimento. Sto seguendo le specifiche MDN: aspetterò che vengano aggiornate. – commonpike

14

Ecco una versione alternativa basata su MDN spec:

function encodeURI($uri) 
{ 
    return preg_replace_callback("{[^0-9a-z_.!~*'();,/?:@&=+$#-]}i", function ($m) { 
     return sprintf('%%%02X', ord($m[0])); 
    }, $uri); 
} 
+2

Codice meraviglioso ... –

+1

Hai dimenticato il trattino '-' – disfated

+1

@disoddisfatto! Passò inosservato ... Grazie per avermelo detto, ho appena aggiustato la risposta per includerlo. :) –