2011-02-08 14 views
19

¿Hay alguna función encodeURI() en PHP que no codifica: [email protected]#$&*()=:/,;?+'?encodeURI() en PHP?

+0

lo tanto, que los caracteres * * Qué quieres que codificar? –

+1

es posible que tengas que volver a personalizar y decodificar los caracteres que te gustaría conservar, si esa es una lista breve – zanlok

Respuesta

29

estoy usando esto ahora

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

} 

Básicamente rawurlencodes todo, y luego decodifica algunas cosas atrás (como Zanlok sugirió en su comentario). Esto debería ajustarse a las especificaciones de Mozilla de encodeURI.

+0

Realmente útil ... –

+1

Puedes agregar ''% 5B' => '[', '% 5D '=>'] ''para los caracteres reservados que coincidan con los RFC3986 (soportes IPV6) – mems

+0

@mems, gracias por la sugerencia. Estoy siguiendo las especificaciones de MDN. Esperaré a que se actualicen. – commonpike

14

Aquí está una versión alternativa basada en las especificaciones MDN:

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

Código maravilloso ... –

+1

Olvidó el guión '-' – disfated

+1

@disfated ¡De hecho! Pasó desapercibido ... Gracias por informarme, acabo de arreglar la respuesta para incluirla. :) –