Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 1/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:29 2021 / +0000 GMT
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 2/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:29 2021 / +0000 GMT
CLAVE
FORMATO
b
El argumento es tratado como un integer y presentado como un número binario.
c
El argumento es tratado como un integer y presentado como el caracter con ese valor ASCII.
d
El argumento es tratado como un integer y presentado como un número decimal (con signo).
e
El argumento es tratado como notación científica (e.g. 1.2e+2). El especificador de precisión indica el número de dígitos después del
punto decimal.
E
Como %e pero utiliza la letra mayúscula (e.g. 1.2E+2).
u
El argumento es tratado como un integer y presentado como un número decimal sin signo.
f
El argumento es tratado como un float y presentado como un número de punto flotante (depende de la configuración regional).
F
El argumento es tratado como un float y presentado como un número de punto flotante (no depende de la configuración regional).
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 3/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:29 2021 / +0000 GMT
s
El argumento es tratado y presentado como un string.
x
El argumento es tratado como un integer y presentado como un número hexadecimal (con las letras en minúsculas).
X
El argumento es tratado como un integer y presentado como un número hexadecimal (con las letras en mayúsculas).
La función sprintf() actúa como la anterior pero sin poder mostrar su resultado en la página, por lo que éste debe ser almacenado en
otra variable. Tienes un ejemplo de su uso en el script valorFormateado.php:
<?php
$precio1 = 68.75;
$precio2 = 54.35;
$precio = $precio1 + $precio2;
echo "El valor de $precio es ".$precio."<br />";
$formateado = sprintf ("%.2f ?", $precio);
echo "El mismo valor formateado es ".$formateado."<br />";
?>
Uso de sprintf
El resultado de la ejecución aparece a continuación:
Observa, en la línea resaltada en el código, que esta vez, a pesar de indicar que es un número flotante, no hemos establecido la
cantidad de posiciones enteras (entre % y .). Esto hace que se usen tantas posiciones enteras cómo sean necesarias, de forma
automática.
Esto nos será muy útil más adelante, así que quédate con la copla.
Veamos un ejemplo de uso de printf () que aclarará un poco más la operativa de los formatos. Vamos a suponer el caso de que
quisieras mostrar en una tabla el consumo de combustible de un motor a lo largo de quince días, teniendo en cuenta que gasta,
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 4/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
Tabla formateada
Como ves, los datos de consumo del motor aparecen alineados de modo que queda un resultado legible a primera vista. Veamos
cómo hemos obtenido esta colocación de los datos. En primer lugar fíjate en el uso de printf ():
printf($formato, 17, $dia, $dia*17);
Como ves, esta función puede recibir más de dos argumentos. Los argumentos segundo y siguientes serán tenidos en cuenta como
datos a mostrar adaptándose al formato especificado en el primer argumento. Respecto a este formato encontramos varios usos.
Empecemos por %'_7d. Cuando en una definición de formato aparece el signo del porcentaje, seguido de la comilla simple, estamos
indicando que el siguiente carácter deberá ser usado como de relleno para conseguir una alineación de datos. En este caso es el guión
bajo. A continuación vemos el número 7. Esto quiere decir que el dato que se muestre deberá ocupar siete posiciones, completando
las que falten con el carácter de relleno. Como el dato que se muestra aquí (el número 17) tiene dos caracteres, se añaden 5 caracteres
de relleno. Por último, la letra d especifica que el valor que se va a mostrar debe aparecer como un número en base 10 (el sistema
habitual de numeración).
A continuación, siguiendo con la cadena de formato, encontramos un asterisco. Como éste no es un carácter específico de formato,
PHP lo determina como directamente imprimible.
Además, un carácter imprimible determina que el siguiente formato se aplicará al tercer argumento de la función que, en este caso,
es la variable $dia. En general, los formatos se estructuran de la siguiente manera:
Carácter de relleno. Conviene especificar uno diferente del espacio en blanco dado que, cuando hay varios espacios consecutivos,
HTML los ignora.
Alineamiento. Por defecto, la función alinea por la derecha, poniendo los caracteres de relleno a la izquierda. Si queremos cambiar
esto, añadiremos el signo menos (-).
Valor numérico. Determina el mínimo número de caracteres que se deben mostrar, incluyendo los del valor a mostrar y los de
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 5/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
relleno.
Número de decimales. Se precede por un punto (.) y especifica cuántos decimales se le deben conceder al valor a mostrar, tal como
veíamos en valorFormateado.php.
Tipo de datos. Se determinan según la tabla que hay más arriba a este respecto.
De todos modos, y esto es una opinión personal, cuando necesites formatear datos para su presentación considera el uso de tablas,
capas u otros contenedores (bootstrap, por ejemplo, aporta buenas soluciones a este respecto, pero eso es otra historia). Sin embargo,
para un formateado rápido de cadenas cuentas también con la función str_pad(), que permite establecer caracteres de relleno a una
cadena de un modo más fácil que printf(). Esta función recibe cuatro argumentos:
Para ver un ejemplo de funcionamiento observa el listado del script rellenaCadena.php, donde hemos omitido, a propósito, el
argumento relativo a la alineación del relleno.
<?php
$cadena = "Esto es una cadena";
$cadena = str_pad($cadena, 25, "+");
echo $cadena;
?>
El resultado será que la cadena se mostrará tal como aparece a continuación:
Esto es una cadena+++++++
También contamos con una función específica para repetir una cadena. Se trata de str_repeat(). Esta función recibe dos argumentos.
El primero es la cadena en cuestión y el segundo, el número de veces que se debe repetir dicha cadena. Veamos un ejemplo en el
script repiteCadena.php:
<?php
$cadena = "*CADENA*";
$cadena = str_repeat($cadena, 4);
echo $cadena;
?>
En la página aparecerá lo siguiente:
*CADENA**CADENA**CADENA**CADENA*
Normalmente, por la naturaleza del uso de esta función, la cadena que constituye el primer argumento suele estar formada por un
solo carácter, para crear una línea, un relleno, cosas así.
Con mucha frecuencia es necesario poner todas las letras en mayúsculas o en minúsculas en una cadena antes de mostrarla. Para
ello, contamos con las funciones strtoupper() y strtolower(). Estas funciones reciben como argumento la cadena que queremos
modificar. Tienes un ejemplo de funcionamiento en mayusMinus.php:
<?php
$cadena = "Esto Es Una Cadena.";
$mayus = strtoupper($cadena);
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 6/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
$minus = strtolower($cadena);
echo "La cadena original es ".$cadena."<br />";
echo "Todo en mayúsculas es ".$mayus."<br />";
echo "Todo en minúsculas es ".$minus."<br />";
?>
Carga el script en el navegador para ver su funcionamiento.
Existen otras dos funciones que podríamos considerar complementarias de las anteriores: se trata de ucfirst() y ucwords(). Ambas
reciben como argumento una cadena o el nombre de una variable que contiene una cadena. La primera función convierte a
mayúscula el primer carácter de la cadena (si es una letra, claro). La segunda convierte a mayúscula la primera letra de cada palabra.
Es importante puntualizar que estas funciones no convierten ninguna letra en minúscula, es decir, si la cadena ya está en mayúsculas,
no resulta modificada. Por esta razón es conveniente aplicarle a la cadena la función strtolower() previamente al uso de alguna de
estas dos últimas. Mira un ejemplo de uso en el script capitaliza.php:
<?php
$cadena = "esto es una cadena.";
$mayus1 = ucfirst($cadena);
$mayus2 = ucwords($cadena);
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 7/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
La function strtr() establece correspondencia entre los caracteres originales y los de sustitución, uno a uno. Supongamos que tiene
que hacer un trabajo que implique la presentación de un texto sin acentos, y el texto original incluye letras acentuadas. En este caso
escribiríamos algo así:
$nuevaCadena = strtr ($cadena, "ÁÉÍÓÚáéíóú", "AEIOUaeiou");
En este ejemplo, la variable $cadena contiene el texto original, con algunas letras acentuadas. En la variable $nuevaCadena se
almacenará una copia del texto en la que las ?Á? habrán sido sustituidas por ?A?, las ?É? se habrán remplazado con ?E?, y, así,
sucesivamente. Es decir, cada aparición de un carácter del segundo argumento, será sustituido por el correspondiente del tercero.
Veamos un ejemplo en el script cambiaCaracter.php:
<?php
$cadenaOriginal = "INÉS SÁNCHEZ es Técnica en Electrónica.<br />";
echo $cadenaOriginal;
$cadenaModificada = strtr($cadenaOriginal, "ÁÉÍÓÚáéíóú", "AEIOUaeiou");
echo $cadenaModificada;
?>
El resultado es el siguiente:
INÉS SÁNCHEZ es Técnica en Electrónica.
INES SANCHEZ es Tecnica en Electronica.
Observa que para una situación como ésta difícilmente podríamos usar str_replace(), ya que tendríamos que incluir esta función diez
veces en el script para contemplar todos los posibles casos de vocales acentuadas, y eso solamente con el español. Imagina ahora si
el texto está en francés, alemán o polaco, que tienen más variedad de tildes que nuestro idioma.
A menudo es necesario determinar si una cadena contiene una determinada subcadena. Para esto contamos con la función strstr(), que
recibe dos argumentos separados por una coma. El primero es la cadena en la que hay que buscar. El segundo es la subcadena que
deseamos encontrar. Vea el listado del script compruebaSubcadena.php:
<?php
$cadena = "Esta es la cadena en la que se buscará una subcadena.";
echo "La cadena es: $cadena<br />";
$subcadena = "la cadena";
echo "La subcadena a buscar es: $subcadena<br />";
if (strstr ($cadena, $subcadena)){
echo "La subcadena SI existe dentro de la cadena.<br />";
} else {
echo "La subcadena NO existe dentro de la cadena.<br />";
}
?>
Al ejecutar este script la función strstr() determina que la subcadena está dentro de la cadena. Sin embargo, no nos dice en qué
posición. Y esto es algo que, a menudo, vamos a necesitar saber. Para ello contamos con la función strpos(). Con la misma sintaxis
que la anterior, nos devuelve el punto donde la subcadena se encuentra en la cadena. A este efecto recuerda que los caracteres de una
cadena se empiezan a contar por la izquierda y por 0, de modo que el primer carácter es el 0, el segundo el 1, y así sucesivamente.
Observa el script posicion.php:
<?php
$cadena = "Esta es la cadena en la que se buscará una subcadena.";
echo "La cadena es: ".$cadena."<br />";
$subcadena = "la cadena";
echo "La subcadena a buscar es: ".$subcadena."<br />";
$posicion = strpos ($cadena, $subcadena);
if ($posicion !== false) {
echo "La subcadena se inicia dentro de la cadena en la posición: ".$posicion."<br />";
} else {
echo "La subcadena no forma parte de la cadena.<br />";
}
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 8/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
?>
Observa en la primera línea resaltada la sintaxis de la función. En la segunda línea resaltada fíjate en la forma en que hemos usado el
condicional. Esto es así porque si la subcadena existe dentro de la cadena, strpos() nos devuelve su posición, pero si no existe nos
devuelve un valor lógico false. Para comprender la operativa de este condicional ejecuta primero el script, tal como está. Deberás
obtener:
La subcadena se inicia dentro de la cadena en la posición: 8
A continuación, edita el código para cambiar la línea que define la variable $subcadena, de modo que quede, por ejemplo, así:
$subcadena = "XXXX";
Ejecuta de nuevo el script. El resultado esta vez te indicará que no se ha localizado la subcadena. Esto es la forma habitual de
trabajar del intérprete de PHP. Las funciones, cuando no pueden obtener un resultado coherente con su objetivo, devuelven un valor
lógico false. Esto resulta muy útil para poder determinar mediante condicionales, como hemos hecho aquí, si se ha obtenido o no un
resultado. En muchos códigos verás cómo empleamos este recurso con cierta asiduidad.
ATENCIÓN. Esto es importante. Dado que PHP es un lenguaje muy débilmente tipado, es decir, que es muy flexible con los tipos
de datos, en general se asume que un valor 0, o una cadena vacía ("") es equivalente a un false booleano, y cualquier otro valor
numérico, o una cadena con cualquier contenido puede ser considerada por el intérprete cómo un true booleano.
Esto representa un problema en el uso de la función strpos(), así cómo en otras. En efecto. Si el fragmento que buscamos está al
principio de la cadena, se encuentra en la posición 0. La función devuelve el valor 0. Si usamos un condicional del tipo if (!$posicion)
{ // Lo que sea el 0 será interpretado cómo false, y el condicional nos dirá que no ha encontrado lo que estábamos buscando. Por eso
hay que recurrir al operador de no identidad, para que lo que se compruebe sea, realmente, el valor false, y no se interprete el 0 como
false. Recuerda que el operador de identidad (o de no identidad, en este caso) comprueba estrictamente no sólo el valor de un dato,
sino también su tipo.
Verifica en el código cómo el valor true o false devuelto por la función puede usarse en condicionales que, de este modo, se hallan
supeditados a la ejecución de una función.
Después de hacer esta comprobación, vuelve a editar el script para dejarlo como estaba al principio.
LA CODIFICACIÓN URL
Cuando hablábamos del envío de formularios en un artículo anterior dijimos que, al enviar un formulario al servidor mediante el
método get, los campos y los valores introducidos por el usuario se transmiten a través de la URL en un formato específico que se
conoce como codificación URL. Considera las dos cadenas de texto siguientes:
Esta es una cadena de texto que será codificada como URL. ¿Cómo se mostrará? ¡¡VEÁMOSLO!!
y
Esta%20es%20una%20cadena%20de%20texto%20que%20ser%E1%20codificada%20como%20URL.%20%BFC%F3mo%20se%20mostrar%E1
%3F%20%A1%A1VE%C1MOSLO%21%21
La primera cadena es una frase normal, completamente legible. La segunda cadena es, a priori, ilegible. Si la examinamos
someramente por encima podemos intuir que, en realidad, es la misma que la primera, codificada de algún modo. El tipo de cifrado
corresponde a las estipulaciones de los RFC 1630] y 1738. Pulsa en los enlaces para leerlos (ojo, esta documentación siempre la vas a
encontrar en inglés).
Los RFC (Request For Comments) son documentos, universalmente aceptados, que regulan el funcionamiento y modo de uso de
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 9/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
todos los protocolos de comunicaciones en Internet, métodos de cifrado y transmisión de datos, formatos de cabeceras de páginas,
etc. Constituyen una riquísima fuente de información y documentación para programadores que se enfrenten a trabajos con redes de
ordenadores y, en general, para cualquier persona que sienta curiosidad por estos temas. Para saber más acerca de los RFC accede a
este enlace.
Básicamente se trata de lo siguiente. Existen determinados caracteres conocidos como ?inseguros?. Esto se refiere al hecho de que la
transmisión de dichos caracteres en una URL ?abre? lo que se conoce como ?agujeros de seguridad? o ?bugs?. Son ?puertas
traseras? que puede utilizar un atacante para acceder a zonas de los servidores que normalmente son reservadas, o para abrir ficheros
para los que hace falta algún tipo de autorización especial. Por razones de seguridad, estos caracteres no deben ser transmitidos en
una URL. Y, sin embargo, son necesarios, así que hay que transmitirlos. Lo que se hace es codificarlos antes de la transmisión y
decodificarlos en la recepción, siguiendo un patrón muy eficiente: se toma el código ASCII del carácter que queremos cifrar, se
expresa con dos dígitos en hexadecimal y se le antepone el símbolo %. Así pues consideremos, por ejemplo, el más obvio de los
caracteres inseguros: el espacio en blanco. Su código ASCII es el 32. En hexadecimal se expresa como 20. Por lo tanto, el espacio en
blanco, cifrado según la codificación URL, queda como %20. Los caracteres inseguros son el espacio en blanco, las letras acentuadas
(tanto mayúsculas como minúsculas), los signos de puntuación, excepto el punto y el guión (-), y los saltos de línea. Dicho de otro
modo, los caracteres no sujetos a codificación son los dígitos del 0 al 9, las letras del alfabeto inglés, el punto y el guión.
PHP permite cifrar textos según la codificación URL. Para ello recurrimos a la función rawurlencode(), que recibe un texto ?normal?
y lo devuelve cifrado. Como es lógico, también existe una función que permite recuperar el texto original. Se trata de rawurldecode().
Observa el listado codificarUrl.htm:
<html>
<body>
<p>
Teclee un texto para su codificación URL.
</p>
<form id="formulario1" method="post" action="codificarUrl.php">
<p>
<textarea name="textoOriginal" cols="50" rows="4" id="textoOriginal"></textarea>
</p>
<p>
<input name="mandar" type="submit" value="ENVIAR" />
<input name="borrar" type="reset" value="BORRAR" />
</p>
</form>
</body>
</html>
Como ves es una página que contiene un formulario. En dicho formulario hay una caja de texto multilínea y los botones típicos de
tipo submit y reset. Escribe un texto con caracteres diversos en la caja de texto. Al enviar el formulario se manda el contenido de la
caja de texto al script codificarUrl.php, cuyo código aparece a continuación:
<?php
$textoCodificado = rawurlencode($_POST["$textoOriginal"]);
$textoRecuperado = rawurldecode($textoCodificado);
?>
<html>
<body>
<table width="505" border="1">
<tr>
<td width="505">
<table align="left" width="500" cellpadding="4" border="2">
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 10/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
<tr>
<th>TEXTO ORIGINAL</th>
</tr>
<tr>
<td bgcolor="#C0C0C0">
<?php echo $textoOriginal; ?>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="505">
<table align="left" width="500" cellpadding="4" border="2">
<tr>
<th>TEXTO CODIFICADO</th>
</tr>
<tr>
<td bgcolor="#C0C0C0">
<?php echo $textoCodificado; ?>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="505">
<table width="500" cellpadding="4" border="2">
<tr>
<th>TEXTO RECUPERADO</th>
</tr>
<tr>
<td bgcolor="#C0C0C0">
<?php echo $textoRecuperado; ?>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
Carga en el navegador la página codificarUrl.htm, escribe en la caja de texto un contenido y pulsa el botón ENVIAR. Al cargarse el
script codificarUrl.php verás el resultado de estas funciones.
En las líneas resaltadas en el código se ve cómo usamos las dos funciones, para cifrar el texto y para descifrarlo. Estas funciones
tienen muchísima utilidad en varias situaciones. Una de las más corrientes es cuando el texto que el usuario escribe está destinado a
almacenarse en una base de datos o en un archivo de disco. También es importante realizar esta codificación cuando el texto va a ser
posteriormente mostrado formando parte de una página. Lógicamente, cuando llegue el momento de mostrarlo, será necesario
descifrarlo previamente con la función rawurldecode(). De lo contrario, se mostraría al usuario un contenido codificado e ilegible.
Quiero hacer un pequeño inciso para llamar tu atención sobre un detalle en el script. Fíjate en la forma de introducir el texto, que
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 11/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 12/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
<body>
<table width="505" border="1">
<tr>
<td width="505">
<table align="left" width="500" cellpadding="4" border="2">
<tr>
<th>TEXTO ORIGINAL (YA CODIFICADO)</th>
</tr>
<tr>
<td bgcolor="#C0C0C0">
<?php echo $_POST["ocultoTexto"]; ?>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="505">
<table align="left" width="500" cellpadding="4" border="2">
<tr>
<th>TEXTO RECUPERADO</th>
</tr>
<tr>
<td bgcolor="#C0C0C0">
<?php echo $textoRecuperado; ?>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
Observa el resultado en tu navegador. Como ves, hemos logrado enviar y recibir el texto ya cifrado.
Hay una cosa que tienes que tener en cuenta al emplear este recurso. Si tecleas tu texto en dos o más líneas (pulsando la tecla INTRO
mientras escribes), verás que el texto se recupera cómo una sóla línea.0 Esto sucede porque el carácter de salto de línea que maneja
PHP no corresponde con la etiqueta <br /> de XHTML, así que este último se ve incapaz de mostrarlo en la página. Lo que tenemos
que hacer es buscar la secuencia del texto codificado que corresponde a un salto de línea y sustituirla por una etiqueta <br /> antes de
hacer la decodificación. Y, para esto, nos va a ayudar la función str_replace() que hemos conocido en este mismo artículo. Mira la
siguiente línea de ejemplo:
$textoRecuperado = rawurldecode(str_replace("%0D%0A", "<br />",$_POST["ocultoTexto"));
Lo que hemos hecho ha sido identificar la secuencia que corresponde al salto de línea (%0D%0A), y sustituirla por <br /> antes de
decodificar. Cuando dos o más funciones de PHP están anidadas una dentro de otra, como en este caso, el intérprete las resuelve
desde dentro hacia fuera, de forma, que primero se resuelve la más interior, y la siguiente hacia fuera opera con el resultado de la
anterior. En este caso, primero se ejecuta str_replace(), y rawurldecode() opera con el resultado obtenido.
De este modo, ya sabes cómo codificar texto para su envío por La Red, y su posterior almacenamiento en ficheros o bases de datos
en el lado del servidor (el tema del almacenamiento será tratado en posteriores artículos). También sabes cómo recuperar los textos y
mostrarlos en la página igual que los tecleó el usuario.
Para cifrar y descifrar textos puedes usar también las funciones urlencode() y urldecode(). Son similares a las que ya conoces. La
diferencia más evidente que vas a apreciar es que los espacios en blanco son sustituidos por un signo + en lugar de por la secuencia
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 13/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
%20. Esto se emplea cuando el cifrado debe adaptarse a un formato MIME estándar. Si en alguna ocasión se te presenta el caso, usa
estas dos funciones. Si no, puedes usar el juego que quieras. Yo, personalmente, suelo inclinarme por las dos que hemos conocido en
primer lugar.
En encodeDecode.php tienes un ejemplo de uso de estas dos últimas funciones. Ejecútalo en el navegador y ves el resultado. Como
puedes comprobar, los espacios en blanco son sustituidos por signos +. Puedes hacer algunas pruebas cambiando el contenido de la
variable $cadena, introduciendo distintos caracteres, para ver el comportamiento del script.
<?php
$cadena = "Esta es la cadena que usaremos para su codificación";
echo "La cadena es: ".$cadena."<br />";
$cadenaCodificada = urlencode($cadena);
echo "La cadena codificada es: ".$cadenaCodificada."<br />";
$cadenaRecuperada = urldecode($cadenaCodificada);
echo "La cadena recuperada es: ".$cadenaRecuperada."<br />";
?>
TRATAMIENTO DE CADENAS PARA HTML
En este apartado vamos a conocer algunas funciones que PHP incluye para el tratamiento de cadenas específico para su integración
con HTML, así como para gestionar algunos aspectos del entorno web, aunque más adelante conoceremos detalles más avanzados.
Es muy común que el contenido de una variable alfanumérica deba ser mostrado en la página. Y también lo es que contenga
determinados caracteres que no correspondan al alfabeto internacional. Como sabes, en XHTML se contempla que determinados
caracteres deben ser sustituidos por las entidades. Por ejemplo, la letra ñ se escribe en una página como ñ para que todos los
navegadores del mundo puedan mostrarla sin problemas. Sin embargo, PHP no traduce estos caracteres directamente. Supongamos
un documento como el siguiente:
<html>
<body>
<?php
$cadena = "España";
echo $cadena;
?>
</body>
</html>
Si cargas este código en tu navegador y tratas de ver el código fuente de la página te encontrarás con algo parecido a esto:
<html>
<body>
España
</body>
</html>
Fíjate en la tercera línea. En realidad, para obtener una correcta programación en HTML, esta línea debería ser España. PHP
cuenta con una solución para estos casos. Se trata de la función htmlentities(). Ésta recibe como argumento una cadena y sustituye
todos los caracteres no pertenecientes al alfabeto internacional por las entidades HTML oportunas, devolviendo la cadena lista para
su presentación en la página. Observa el script entidades.php:
<html>
<body>
<?php
$cadena = "España";
echo htmlentities($cadena);
?>
</body>
</html>
Cuando quieras ver el código fuente de la página en tu navegador, obtendrás lo siguiente:
<html>
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 14/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
<body>
España </body>
</html>
Como ves, la letra ñ ha sido convertida a su correspondiente entidad.
Otra función que también genera las entidades HTML de una cadena es htmlspecialchars(). Sin embargo, ésta es más antigua y no
contempla todas las posibles entidades.
En PHP contamos con la función get_html_translation_table(), que genera una matriz con todas las entidades que contempla XHTML.
Esta es una matriz asociativa, en la que la clave de cada elemento es el carácter y el valor es la entidad XHTML. Observa el script
listaEntidades.php:
<html>
<body>
<?php
$matrizDeEntidades = get_html_translation_table (HTML_ENTITIES);
echo "<table border='2' cellpadding='2' cellspacing='4'>n";
echo "<tr>n";
echo "<th colspan='16'>LISTADO DE ENTIDADES HTML</th>n";
echo "</tr>n<tr>n";
for ($contador = 0; $contador < 8; $contador ++){
echo "<td>Car.</td>n<td>Entidad</td>n";
}
echo "</tr>n";
echo "<tr>n";
$contador = 0;
foreach $matrizDeEntidades as $clave=>$valor{
$valor = substr($valor,1);
echo "<td>$clave</td>n<td>&".$valor."</td>n";
$contador ++;
if ($contador > 7){
echo "</tr>n<tr>n";
$contador = 0;
}
}
echo "</tr>n";
echo "</table>";
?>
</body>
</html>
El resultado es la tabla que ves en tu navegador. Como ves, se genera una tabla con todas las entidades XHTML de caracteres no
reconocidos en el alfabeto internacional. Observa en el listado del script cómo hemos empleado la función get_html_translation_table()
. Como argumento le hemos pasado HTML_ENTITIES, una constante de PHP que hace referencia a la lista de entidades. La
alternativa sería haberle pasado HTML_SPECIALCHARS. Sin embargo, el resultado es mucho más pobre.
ATENCIÓN. Lo de las entidades XHTML y las funciones PHP que las manejan, está bien para páginas estáticas, cuyo contenido
varía poco o menos en el tiempo, y ademas son pequeñas y poco aspiracionales, pero es un sistema que se ha quedado obsoleto. PHP
nos ofrece una solución mejor. Incluye al principio de cada una de tus páginas la siguiente línea:
header('Content-Type: text/html; charset=UTF-8');
La función header() sirve para enviar ciertas cabeceras al navegador. La veremos en detalle más adelante. De momento, basta saber
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 15/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
que con la línea indicada estamos forzando que se use la codificación UTF-8, que es más completa y universal que la codificación
por defecto que puede ser un latin o similar. Esto hará que las letras acentuadas, letras distintas del alfabeto inglés, y otros caracteres
se muestren correctamente en el navegador sin tener que usar entidades.
Otra función bastante útil en ocasiones es parse_url(). Ésta recibe como argumento la dirección de un documento en Internet o en una
Intranet, y devuelve una matriz con todos los elementos que forman dicha dirección. Observe el script datosUrl.php:
<html>
<body>
<?php
$datosDeURL = parse_url("http://eldesvandejose.com");
echo "<table border='2' cellpadding='2' cellspacing='2'>n";
echo "<tr>n<th colspan='2'>DATOS DE URL</th>n";
echo "<tr>n<th>Dato</th>n<th>Valor</th>n";
echo "</tr>n";
foreach ($datosDeURL as $clave=>$valor){
echo "<td>$clave</td>n<td>$valor</td>n</tr>n<tr>n";
}
echo "</tr>n";
echo "</table>n";
?>
</body>
</html>
Realmente ésta es una dirección muy simple. Esta función puede sacar más datos, tal como se ve en la siguiente tabla:
DATO
CONTENIDO
scheme
El protocolo de comunicación. Normalmente suele ser http. Sin embargo, puede ser ftp, file, etc. dependiendo de la comunicación
establecida con el recurso.
host
La dirección IP o el nombre del servidor.
port
El número de puerto en el que se espera que el servidor escuche.
user
El login del usuario que accede al recurso.
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 16/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
password
La clave de acceso del usuario especificado.
path
La ruta, dentro del host, donde está el recurso al que se pretende acceder.
query
Los datos que se le pasen al recurso, como es el caso de campos de un formulario enviados mediante get.
En la mayoría de los casos, una URL no tiene especificados todos los posibles valores, como es el ejemplo que hemos visto en el
script datosUrl.php.
LAS CADENAS COMO MATRICES
PHP (así cómo algunos otros lenguajes) contempla la posibilidad de convertir una cadena alfanumérica en una matriz, y viceversa:
tomar una matriz y colocar todos sus elementos, uno a continuación de otro, formando una cadena que, lógicamente, puede ser
almacenada en una variable.
Para convertir una cadena en una matriz de datos debemos seguir dos pasos. En primer lugar, contaremos con la función chunk_split()
. Ésta recibe como parámetro obligatorio la cadena que hay que dividir (o la variable que la contiene) y genera otra cadena en la que,
cada 76 caracteres, introduce una secuencia ?rn? (retorno de carro y nueva línea). Como parámetros opcionales podemos incluir el
número de caracteres que se contarán en cada parte de la cadena resultante, en lugar de 76, así como la secuencia que actúa como
separador, en lugar de ?rn?. Por ejemplo, supongamos que quieres introducir una secuencia ?*-*? cada 10 caracteres. La sintaxis a
emplear sería la siguiente:
$cadenaNueva = chunk_split($cadenaOriginal,10,?*-*?);
Es importante que comprendas que chunk_split() NO modifica la cadena que recibe como argumento, sino que genera otra variable
con la cadena modificada, así que la original permanece inalterada.
Una vez que tenemos la cadena modificada en otra variable llega el momento de usar la función explode(), que ya conocemos de un
artículo anterior, para convertir dicha cadena en una matriz. Esta función recibe dos parámetros obligatorios. El primero es la
secuencia que debe buscar como separador y que es la que establecimos en chunk_split(). El segundo es el nombre de la cadena
modificada, generada por chunk_split(). La función explode() devuelve una matriz en la que creará un nuevo elemento cada vez que
encuentre el separador. Así pues, la matriz tendrá tantos elementos como separadores haya, más uno. Para aclarar conceptos, veamos
el uso combinado de estas dos funciones en el listado del script cadena2matriz.php:
<?php
$cadOriginal = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
//Se usa la funcion chink_split para generar una cadena
// en la que,cada 10 caracteres, se introduce la secuencia "*.*".
$cadenaModificada = chunk_split($cadOriginal, 10, "*.*");
//Se muestran las cadenas en la página para ver que
//la cadena original no se ha alterado.
echo "La cadena original es: $ cadOriginal <br />";
echo "La cadena modificada es: $cadenaModificada<br /><br /><br />";
//Se genera una matriz a partir de la cadena modificada.
$matriz = explode ("*.*", $cadenaModificada);
/*Cada elemento de la matriz contendrá un fragmento de la cadena original.
PHP usa la secuencia separadora ("*.*", en este ejemplo) para saber donde debe empezar
y acabar cada elemento de la matriz. La matriz se genera, de forma automática con un
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 17/18 |
This page was exported from - Recursos para programadores
Export date: Mon Jun 21 4:34:30 2021 / +0000 GMT
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com | Page 18/18 |