2011-02-08 240 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); 
}