29
Capítulo 6 Manejo de cadenas
6 Manejo de cadenas Otro tipo de variables usadas en PHP son las cadenas de caracteres (string). Una cadena es una colección de caracteres encerrados entre comillas simples o dobles. La cadena puede contener una letra, una palabra, una oración, un párrafo, código HTML, números y símbolos. A continuación se tratará lo más básico sobre manejo de cadenas de caracteres.
6.1 Concatenación El operador utilizado para la concatenación de variables o cadenas de caracteres es el punto (.), ejemplo: $var1 = “Hola, “; $var2 = “mundo”; $saludo = $var1 . $var2; // Hola, mundo Debido al modo en que PHP maneja las variables, también se pueden concatenar variables sin usar el punto: $saludo = “$var1 $var2”; aunque de esta forma se incluye un espacio entre las dos variables. También se pueden concatenar variables tipo string con variables numéricas.
6.2 Comillas mágicas o magic quotes Las “magic quotes” de PHP, o comillas mágicas, es una funcionalidad que se encarga automáticamente de añadir backslashes (\) a las comillas dobles y simples de la información que llega a una página vía parámetros GET, POST o a los que se guardan en cookies. Es recomendable escribir código con las comillas mágicas deshabilitadas, y en su lugar escapar los datos en tiempo de ejecución, a medida que se necesite.
Programación
Arturo Ruvalcaba
Capítulo 6 Manejo de cadenas
30
Qué son las comillas mágicas Cuando las comillas mágicas están habilitadas, todos los caracteres ' (comilla sencilla), " (comilla doble), \ (barra invertida) y NULL se escapan con una barra invertida de forma automática. Esto es idéntico a lo que hace la función addslashes( ). Existen tres directivas de comillas mágicas: magic_quotes_gpc Afecta los datos de peticiones HTTP (GET, POST y COOKIE). No puede definirse en tiempo de ejecución, y su valor predeterminado es on en PHP. magic_quotes_runtime Si se habilita, la mayoría de funciones que devuelven datos de una fuente externa, incluyendo bases de datos y archivos de texto, escaparán las comillas con una barra invertida. Puede definirse en tiempo de ejecución, y su valor predeterminado en PHP es off. magic_quotes_sybase Si se habilita, una comilla sencilla se escapa con una comilla sencilla en lugar de una barra invertida. Asimismo, sobreescribe completamente magic_quotes_gpc. Habilitar ambas directivas quiere decir que sólo las comillas sencillas se escapan como ''. Las comillas dobles, las barras invertidas y los NULL permanecerán intactos y sin escapar. Porqué usar comillas mágicas Útil para principiantes Las comillas mágicas son implementadas en PHP para ayudar a que el código escrito por principiantes no resulte peligroso. Aunque la Inyección SQL es posible aun con las comillas mágicas habilitadas, el riesgo es reducido. Conveniencia Para insertar datos en una base de datos, las comillas mágicas básicamente usan addslashes() sobre todos los datos Get, Post, y Cookie, y lo hace automáticamente. Porqué no usar comillas mágicas Portabilidad Asumir que estén habilitadas, o deshabilitadas, afecta la portabilidad. Se recomienda usar get_magic_quotes_gpc( ) para verificar su valor, y escribir el código de forma acorde. Rendimiento Ya que no todo fragmento de datos escapados es insertado en una base de datos, existe una pérdida en rendimiento al escapar todos esos datos. Simplemente llamar las funciones de escape (como addslashes( )) en tiempo de ejecución es más eficiente.
Programación
Arturo Ruvalcaba
31
Capítulo 6 Manejo de cadenas
Aunque php.ini-dist habilita estas directivas por defecto, php.ini-recommended las deshabilita. Esta recomendación se hace principalmente por razones de rendimiento. Inconveniencia Ya que no todos los datos necesitan ser escapados, con frecuencia resulta molesto ver datos escapados cuando no debieran estarlo. Por ejemplo, enviar un correo electrónico desde un formulario y ver un montón de \' en el mensaje. Arreglar esto puedo requerir un uso exagerado de stripslashes(). Funciones addslashes( ) y stripslashes( ) Con la función stripslashes( ) se puede deshacer el efecto de las comillas mágicas cuando éstas están habilitadas. Si la cadena que se envía de una página es: Este texto tiene “comillas”, y las comillas mágicas están habilitadas, la cadena que se recibe en la variable $var será: $var = $_POST[‘comentarios’]; // contenido = Este texto tiene \“comillas\” Esto se puede evitar con la función stripslashes( ), al aplicar; $var = stripslashes($var); o $var = stripslashes ($_POST[‘comentarios’]); el contenido de la variable $var será: Este texto tiene “comillas”. Por otro lado por ejemplo, si se quiere insertar datos, en los cuales hay comillas, en una base de datos y eso puede causar problemas, éstos se pueden evitar con la función addslashes( ), esta función antepone una diagonal invertida (\) a las comillas simples, doble y diagonal invertida.
6.3 Conversión de cadenas a otros tipos de datos Para hacer conversión de cadenas a otros tipos de datos hay que tener en cuenta que una cadena se evalúa como un valor numérico, el valor resultante y el tipo se determinan como sigue. La cadena se evaluará como un doble si contiene cualquiera de los caracteres '.', 'e', o 'E'. En caso contrario, se evaluará como un entero. El valor viene dado por la porción inicial de la cadena. Si la cadena comienza con datos de valor numérico, este será el valor usado. En caso contrario, el valor será 0 (cero). Cuando la primera expresión es una cadena, el tipo de la variable dependerá de la segunda expresión. Ejemplos de tipos de datos: <html> <head> <title>Ejemplo 4</title></head> <body> <h1> Ejemplo de PHP </h1> <?php
Programación
Arturo Ruvalcaba
32
Capítulo 6 Manejo de cadenas
$foo = 1 + "10.5"; // $foo es doble (11.5) print "$foo <br>\n"; $foo = 1 + "-1.3e3"; // $foo es doble (-1299) print "$foo <br>\n"; $foo = 1 + "bob-1.3e3"; // $foo es entero (1) print "$foo <br>\n"; $foo = 1 + "bob3"; // $foo es entero (1) print "$foo <br>\n"; $foo = 1 + "10 sillas"; // $foo es entero (11) print "$foo <br>\n"; $foo = 1 + "10.0 sillas"; // $foo es doble (11) print "$foo <br>\n"; $foo = "10.0 sillas " + 1; // $foo es entero (11) print "$foo <br>\n"; $foo = "10.0 sillas " + 1.0; // $foo es doble (11) print "$foo <br>\n"; ?> </body> </html>
6.4 Lenguajes HTML y PHP La tecnología de PHP se encuentra del lado del servidor, y con frecuencia se utiliza para enviar datos a la red, los cuales puede consistir de simplemente texto, código HTML o ambos. Un problema que se puede presentar es que el usuario puede teclear caracteres HTML en un formulario, lo que puede afectar el formateo de la página o causar problemas de seguridad. Debido a la estrecha relación existente entre HTML y PHP, existen en PHP muchas funciones para manipular los elementos de HTML en las variables tipo string de PHP:
•
Función strip_tags( ) elimina todas las etiquetas HTML y PHP.
•
Función nl2br( ) convierte el carácter de nueva línea (creado cuando el usuario oprime la tecla Enter), en la etiqueta <br /> de HTML.
•
string htmlspecialchars ( string cadena [, int quote_style [, string juego_caracteres]] ) Ciertos caracteres tienen significados especiales en HTML, y deben ser representados por entidades HTML si se desea preservar su significado. Esta función devuelve una cadena con dichas conversiones realizadas, que por defecto son las más habituales para la programación web. Si se requiere traducir todas las entidades HTML, se debe emplear la función htmlentities(). Esta función es útil para evitar que el texto introducido por el usuario contenga código HTML, como ocurre en aplicaciones de foros o libros de visita. El segundo parámetro quote_style indica a la función el modo en el que se tienen que tratar las comillas simples y las comillas dobles. El modo por defecto es ENT_COMPAT, que es el modo retrocompatible que solo traduce las comillas dobles y deja intactas las comillas simples. Si se indica el valor ENT_QUOTES, se traduce tanto las comillas simples como las dobles. Por último, si se indica el valor ENT_NOQUOTES, no se traducen ni las comillas simples ni las dobles.
Programación
Arturo Ruvalcaba
33
Capítulo 6 Manejo de cadenas
Actualmente, las traducciones realizadas son: • • • • •
'&' (ampersand) se convierte en '&amp;' '"' (doble comilla) se convierte en '&quot;' cuando no se utiliza la constante ENT_NOQUOTES. ''' (commilla simple) se convierte en '&#039;' cuando se utiliza ENT_QUOTES. '<' (menor que) se convierte en '&lt;' '>' (mayor que) se convierte en '&gt;'
Ejemplo de htmlspecialchars() <?php $nuevo = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); echo $nuevo; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt; ?>
•
Función htmlentities( ) convierte los caracteres que tienen algún significado especial en el código HTML, o que podrían desplegarse erróneamente en el navegador como acentos o diéresis, en sus equivalentes en formato HTML. Esta función es idéntica en todo a htmlspecialchars(), excepto que con htmlentities(), todos los caracteres que tengan una entidad equivalente en HTML serán cambiados a esas entidades. En htmlspecialchars(), el parámetro opcional quote_style le permite definir lo que será hecho con las comillas 'sencillas' y las "dobles". Toma uno de tres constantes con ENT_COMPAT: Tabla 6.1 Constantes disponibles para quote_style
Nombre de Constante
Descripción
ENT_COMPAT
Convertirá las dobles comillas y dejará solo las comillas sencillas.
ENT_QUOTES
Convertirá las comillas dobles y sencillas.
ENT_NOQUOTES
Mantendrá las comillas dobles y sencillas sin cambios.
Ejemplo 1. Un ejemplo de htmlentities() <?php $str = "A 'quote' is <b>bold</b>"; // Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt; echo htmlentities($str); // Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt; echo htmlentities($str, ENT_QUOTES); ?>
Programación
Arturo Ruvalcaba
34
Capítulo 6 Manejo de cadenas
Las últimas dos funciones convierten una etiqueta HTML , por ejemplo <b>, en los caracteres que la representan, algo como &lt;b&gt;. Ejemplo, si el usuario teclea en alguna parte del formulario el comentario: <b>Su solución es <big>“excelente”</big></b> y lo envía, a continuación se muestra cómo se despliega el texto al usuario cuando se le envía después de aplicarle las funciones anteriores. Sin aplicarle una función: Su solución es \”excelente\” Con stripslashes: Su solución es ”excelente” Con htmlentities: <b>Su solución es <big>“excelente”</big></b> Con strip_tags: Su solución es \“excelente\”
6.5 Otras funciones para cadenas Función str_replace( ) Esta función se utiliza para reemplazar subcadenas dentro de una cadena. Su formato es: str_replace(param_1, param_2, param_3); donde: param_1 es la cadena o variable que contiene la subcadena a buscar. param_2 es la cadena o variable con la que se substituye. param_3 es la variable donde se realiza la búsqueda y sustitución. Ejemplo: $hola = ‘Hola mundo’; $hola = str_replace(‘mundo’, ‘México’, $hola); // ‘Hola México’ Función stei_replace( ) Esta función hace lo mismo que str_replace pero no es sensible a mayúsculas y minúsculas. Es para la versión 5 o superiores de PHP. Función strlen( ) Esta función regresa el número de caracteres (incluyendo espacios y signos de puntuación) contenidos en la cadena dada. Función str_word_count( ) Esta función regresa el número de palabras que tiene una cadena dada (separadas por espacios).
Programación
Arturo Ruvalcaba
35
Capítulo 6 Manejo de cadenas
Función strtok( ) Esta función crea una subcadena (referida como token) de una cadena más larga, con base en un separador predeterminado (como coma o espacio). La función devuelve una subcadena formada por el carácter inicial hasta el carácter anterior al separador. Su formato es: strtok(param_1, param_2); donde: parm_1 es la cadena o variable de donde se va a extraer la subcadena. param_2 es el separador, cadena (ejemplo: ‘ ‘, ‘,’) o variable. Función substr( ) Esta función crea una subcadena de una variable o cadena dada, con los caracteres que se encuentran entre una posición inicial y final de la cadena. Su formato es ; substr (param_1, param_2, param_3); donde: parm_1 es la cadena o variable dada. param_2 es la posición inicial a partir de la cual se formará la subcadena. param_3 es la posición final hasta la que se formará la subcadena. Si la diferencia en caracteres desde la posición inicial hasta la final es mayor a la longitud de la cadena, la subcadena comprenderá desde la posición inicial hasta el final de la cadena. Descripción string substr ( string cadena, int comienzo [, int longitud] ) substr() devuelve la porción de cadena especificada por los parámetros comienzo y longitud. Si comienzo es positivo o 0, la cadena devuelta comenzará en dicho carácter de cadena (los caracteres empiezan a contarse en cero). Por ejemplo, en la cadena 'abcdef', el carácter en la posición 0 es 'a', el carácter en la posición 2 es 'c', y así sucesivamente.
Ejemplo 1. Ejemplo básico de substr()
Programación
Arturo Ruvalcaba
36
Capítulo 6 Manejo de cadenas
<?php echo substr('abcdef', echo substr('abcdef', echo substr('abcdef', echo substr('abcdef', echo substr('abcdef',
1); 1, 3); 0, 4); 0, 8); -1, 1);
// // // // //
bcdef bcd abcd abcdef f
// El acceso a los caracteres dentro de una cadena se puede // realizar directamente mediante las llaves $string = 'abcdef'; echo $string{0}; // a echo $string{3}; // d echo $string{strlen($string)-1}; // f ?>
Si comienzo es negativo, la cadena devuelta comenzará en dicha posición contando desde el final de cadena.
Ejemplo 2. Ejemplo de valores negativos de comienzo <?php $rest = substr("abcdef", -1); // devuelve "f" $rest = substr("abcdef", -2); // devuelve "ef" $rest = substr("abcdef", -3, 1); // devuelve "d" ?>
Si se especifica longitud y es positiva, la cadena devuelta terminará como máximo longitud caracteres tras el comienzo. Si la longitud de la cadena es inferior o igual al valor del comienzo, la función devuelve FALSE. Si se especifica longitud y es negativa, se omitirán longitud caracteres desde el final de la cadena (después de que la posición de comienzo se haya determinado cuando el comienzo es negativo). Si comienzo indica una posición mas allá de estos límites, se devuelve una cadena vacía.
Función trim( )
Esta función elimina espacios en blanco (u otros caracteres) del principio y final de una cadena. Descripción string trim ( string cadena [, string lista_caracteres] ) La función devuelve una cadena con los espacios en blanco eliminados del principio y del final de la cadena indicada en el parámetro cadena. Si no se emplea el segundo parámetro (lista_caracteres), la función trim() elimina los siguientes caracteres:
Programación
Arturo Ruvalcaba
37
Capítulo 6 Manejo de cadenas
• • • • • •
" " (ASCII 32 (0x20)), un espacio en blanco. "\t" (ASCII 9 (0x09)), un tabulador. "\n" (ASCII 10 (0x0A)), una nueva linea. "\r" (ASCII 13 (0x0D)), un retorno de carro. "\0" (ASCII 0 (0x00)), el byte NUL. "\x0B" (ASCII 11 (0x0B)), un tabulador vertical.
Lista de parámetros cadena La cadena a la que se eliminan los espacios en blanco (u otros caracteres) lista_caracteres Además, con el parámetro lista_caracteres, se puede especificar la lista de caracteres que se quieren eliminar. El método consiste en enumerar todos los caracteres que se quieren eliminar, con la posibilidad de emplear .. para indicar un rango de caracteres. Valores retornados La cadena con los espacios en blanco (u otros caracteres) eliminados Función ltrim( ) Hace lo mismo que la función trim ( ) pero elimina los espacios en blanco y otros caracteres que están al inicio de la cadena. Función rtrim( ) Hace lo mismo que la función trim ( ) pero elimina los espacios en blanco y otros caracteres que están al final de la cadena. Funciones ucfirst( ), ucwords( ), strtoupper( ), strtolower( ) ucfirst( ) cambia a mayúscula la primera letra de la cadena. ucwords( ) cambia a mayúscula la primera letra de cada palabra de la cadena. strtoupper( ) cambia a mayúsculas toda la cadena. strtolower( ) cambia a minúsculas toda la cadena. strrev( ) toma una cadena y regresa la copia de ella invertida
Programación
Arturo Ruvalcaba
38
Capítulo 6 Manejo de cadenas
str_repeat( string, count ) toma una cadena y un número (count) y regresa una nueva cadena que consiste en el argumento string repetido count veces. Por ejemplo para formar una línea horizontal: echo str_repeat(‘-’, 40); strcmp( string cadena1, string cadena2 ) Devuelve < 0 si cadena1 es menor que cadena2; > 0 si cadena1 es mayor que cadena2 y 0 si son iguales. Nótese que esta comparación es sensible a mayúsculas y minúsculas.
strval( mixed var ) Devuelve el valor string var. var puede ser cualquier tipo escalar. No es posible usar strval( ) sobre matrices u objetos. Otra forma de delimitar una cadena es utilizando la sintaxis de documentos incrustado "<<<" o heredoc. Para asignar una cadena a una variable usando heredoc se siguen los siguientes pasos: 1) Después del nombre de la variable y el operador de asignación se teclea <<< y un identificador. El identificador puede ser cualquier combinación de letras, números y el guión bajo, mientras no comience con un número. 2) Principie la cadena en una nueva línea. La cadena puede incluir comillas simples y dobles. Cualquier variable se procesará del mismo modo que en una cadena con comillas dobles. 3) Al final de la cadena se coloca el identificador en una nueva línea. Nada más debe estar en esa misma línea excepto el punto y coma que termina la sentencia. Además el identificador debe estar al principio de la línea, no debe estar indentado. Ejemplo: $variable = <<< EOD Ejemplo de cadena que ocupa varias líneas EOD; La marca de final de un documento incrustado (en este caso EOD) debe estar en la primera columna del documento.
Programación
Arturo Ruvalcaba