() translation by (you can also view the original English article)
De vez en cuando vas a tener que enviar datos a una página web o servicio mediante el uso de una URL, por ejemplo en una solicitud GET. Esto es bastante sencillo, ya que las URL son básicamente cadenas de texto, pero las cosas a veces pueden volverse complicadas. Por ejemplo, algunos caracteres tienen un significado especial en las URL (como :
), y algunos caracteres no están permitidos (como el espacio). ¡A veces incluso necesitas codificar una URL en otra URL!
En este tutorial, aprenderás por qué necesitas codificar o decodificar cadenas para enviarlas en direcciones URL y cómo usar las funciones integradas en PHP para hacerlo.
Por qué codificar y decodificar cadenas en direcciones URL
Quizá quieras enviar información como parámetros de consulta a un servicio web u otra página web. Por ejemplo, digamos que quieres enviar la siguiente información a un sitio web como una cadena de consulta:
clave | datos |
redirect | https://code.tutsplus.com |
author | monty shokeen |
page | 2 |
Esa información se codificará en la siguiente cadena de consulta:
1 |
https://www.example.com?redirect=https%3A%2F%2Fcode.tutsplus.com&author=monty%20shokeen&page=2 |
Observa que los caracteres especiales como :
y /
en la URL de "redireccionamiento" han sido codificados como %3A
y %2F
para evitar interferir con la estructura de la URL general. A esto se le llama "escape", y ahí es donde entran las funciones de codificación.
El servidor en example.com recibirá esa información codificada en la cadena de consulta y probablemente necesitará decodificarla más adelante. Ahí es en donde la decodificación de direcciones URL es importante.
Codificación de cadenas con urlencode()
y rawurlencode()
Hay dos funciones diferentes en PHP para codificar cadenas en direcciones URL. Estas se llaman urlencode()
y rawurlencode()
. La principal diferencia entre estas dos es el conjunto de caracteres que codifican y la manera en la que trabajan con los espacios.
En el caso de urlencode()
, la función sustituye todos los caracteres no alfanuméricos, excepto -
, _
y .
, usando un signo de porcentaje seguido de dos dígitos hexadecimales. Los espacios se reemplazan con el carácter +
. Por otro lado, la función rawurlencode()
sustituye todos los caracteres no alfanuméricos, excepto -
, _
, .
y ~
, con un signo de porcentaje seguido de dos dígitos hexadecimales. Esta función también reemplaza los espacios con un signo de porcentaje seguido de dos dígitos hexadecimales: %20
.
El siguiente ejemplo debería aclararte un poco las cosas.
1 |
<?php
|
2 |
|
3 |
$string = 'PHP: Hypertext Preprocessor!'; |
4 |
|
5 |
$urlencoded_string = urlencode($string); |
6 |
echo $urlencoded_string; |
7 |
Output: PHP%3A+Hypertext+Preprocessor%21 |
8 |
$rawurlencoded_string = rawurlencode($string); |
9 |
echo $rawurlencoded_string; |
10 |
Output: PHP%3A%20Hypertext%20Preprocessor%21 |
Como puedes ver, los caracteres no alfanuméricos, como ?
, /
y =
, fueron codificados de la misma manera por ambas funciones. Sin embargo, la función urlencode()
cambió php basics
a php+basics
, mientras que rawurlencode()
lo cambió a php%20basics
.
En general, es una buena idea usar rawurlencode()
para codificar todas tus cadenas en direcciones URL. Hay un par de razones para ello. En primer lugar, la función rawurlencode()
codifica cadenas en base al esquema RFC 3986, que es más moderno. En segundo lugar, esta proporciona una mejor compatibilidad si las cadenas que codificas deben decodificarse más tarde en JavaScript.
Decodificación de cadenas de direcciones URL con urldecode()
y rawurldecode()
Las funciones urldecode()
y rawurldecode()
se utilizan para revertir los cambios realizados por las funciones urlencode()
y rawurlencode()
correspondientes.
Básicamente, esto significa que todas las secuencias que contienen un signo de porcentaje seguido de dos cadenas hexadecimales serán reemplazadas por sus caracteres adecuados. La función urldecode()
cambiará el símbolo +
a un carácter de espacio, y la función rawurldecode()
lo dejará sin cambios.
Aquí hay un ejemplo para ilustrar la diferencia.
1 |
<?php
|
2 |
|
3 |
$urlencoded_string = 'PHP%3A+Hypertext+Preprocessor%21'; |
4 |
|
5 |
echo urldecode($urlencoded_string); |
6 |
//Output: PHP: Hypertext Preprocessor!
|
7 |
|
8 |
echo rawurldecode($urlencoded_string); |
9 |
//Output: PHP:+Hypertext+Preprocessor!
|
10 |
|
11 |
$rawurlencoded_string = 'PHP%3A%20Hypertext%20Preprocessor%21'; |
12 |
|
13 |
echo urldecode($rawurlencoded_string); |
14 |
//Output: PHP: Hypertext Preprocessor!
|
15 |
|
16 |
echo rawurldecode($rawurlencoded_string); |
17 |
//Output: PHP: Hypertext Preprocessor!
|
En el ejemplo anterior, hemos usado las funciones de decodificación para decodifica las cadenas que codificamos en el ejemplo anterior. En la variable $urlencoded_string
, el carácter de espacio fue cambiado a +
. El uso de la función urldecode()
en esta cadena lo cambia de nuevo al carácter de espacio. Sin embargo, la función rawurldecode()
lo deja intacto.
En la variable $rawurlencoded_string
, el carácter de espacio ha sido convertido a %20
y es procesado de la misma manera tanto por urldecode()
como por rawurldecode()
.
Es importante tener cuidado con la función que utilices para decodificar una cadena codificada, ya que el resultado final puede variar dependiendo de lo que hayas utilizado originalmente para codificarla.
Pensamientos finales
Nuestro objetivo en este tutorial fue enseñarte cómo codificar y decodificar cadenas en direcciones URL en PHP. Comenzamos con la necesidad de codificar y decodificar cadenas en direcciones URL y luego proporcionamos una breve descripción general de cuatro funciones diferentes para hacerlo.
Como mencioné anteriormente, la apuesta más segura es usar rawurlencode()
y rawurldecode()
en todas partes. Esto garantizará la coherencia en tu código así como la compatibilidad con otros lenguajes que usan el nuevo esquema de codificación y decodificación de cadenas en direcciones URL.