2011-02-08 30 views
19

PHP中有一些encodeURI()函數不能編碼:[email protected]#$&*()=:/,;?+'encodeURI()in PHP?

+0

所以,*不要*您希望它編碼的字符? – 2011-02-08 04:37:37

+1

你可能需要在這裏定製並解碼出你想保留的字符,如果這是一個簡短列表 – zanlok 2011-02-08 05:53:41

回答

29

我使用這個現在

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)); 

} 

它基本上rawurlencodes一切,然後解碼幾回事情(如Zanlok在他的評論暗示)。這應符合Mozilla規格的encodeURI。

+0

真的很有用... – 2014-07-25 07:43:27

14

這裏有一個備用版本的基礎上MDN規格:

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