2011-01-20 22 views
61

Estoy haciendo una página de búsqueda, donde tipea una consulta de búsqueda y el formulario se envía al search.php?query=your query. ¿Qué función de PHP es la mejor y que debo usar para codificar/decodificar la consulta de búsqueda?¿Cómo codificar URL correctamente una cadena en PHP?

+2

¿Tiene algún problema? Los navegadores y PHP deberían manejar esto automáticamente (por ejemplo, poniendo 'foo bar' en un campo de texto, crea' foo + bar' en la URL). –

+0

@Felix Llamaré al script del buscador usando 'file_get_contents' –

Respuesta

108

Para la consulta de URI use urlencode/urldecode; para cualquier otra cosa, use rawurlencode/rawurldecode.

La diferencia entre urlencode y rawurlencode es que

+0

* application/x-www-form-urlencoded * es solo una variante especial del * Porcentaje de codificación * y solo se aplica para codificar datos de formularios HTML. – Gumbo

+0

¿Qué codificación es mejor, form-urlencoded o porcentaje? –

+1

@Click Upvote: No se pueden comparar de esa manera. El formato * application/x-www-form-urlencoded * es * el * formato * de codificación porcentual, excepto que el espacio está codificado con '+' en lugar de '% 20'. Y además de eso, * application/x-www-form-urlencoded * se utiliza para codificar datos de formulario mientras que * Percent-Encoding * tiene un uso más general. – Gumbo

14

La astutamente llamada urlencode() y urldecode().

Sin embargo, no debería necesitar usar urldecode() en las variables que aparecen en $_POST y $_GET.

+3

El código malicioso' rawurlencode' y 'rawurldecode' ... –

2

Aquí está mi caso de uso, que requiere una cantidad excepcional de codificación. Tal vez piensas que fue artificial, pero ejecutamos esto en producción. Coincidentemente, esto cubre todo tipo de codificación, por lo que estoy publicando como un tutorial.

Caso de uso Descripción

Alguien acaba de comprar una tarjeta de prepago de regalo ("token") en nuestra página web. Los tokens tienen las URL correspondientes para canjearlos. Este cliente quiere enviarlo por correo electrónico a otra persona. Nuestra página web incluye un enlace mailto que les permite hacer eso.

código 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 = 'I just bought a widget for you. 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 that links to that page 
echo '<a href="' . htmlspecialchars($mailToUri) . '">Email your friend</a>'; 

Nota: lo anterior supone que está dando salida a un documento text/html. Si su tipo de medio de salida es text/json, simplemente use $retval['url'] = $mailToUri; ya que la codificación de salida se maneja mediante json_encode().

caso de prueba

  1. Ejecutar el código en un sitio de prueba PHP (es que hay una canónica Debo mencionar aquí?)
  2. Haga clic en el enlace
  3. Envía el correo
  4. Obtenga el correo electrónico
  5. Haga clic en ese enlace

que debes ver:

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

Y por supuesto esto es la representación JSON de $token anteriormente.

Cuestiones relacionadas