Curso de PHP: Nivel Básico – Clase 9. Strings

Clase número 9 del curso de PHP. En este artículo vamos a profundizar los conocimientos que ya tenemos sobre strings. Entre todos los temas que aparecen en esta clase, seguramente habrá algunos que ya han sido explicados en clases anteriores, o en los artículos donde resuelvo los ejercicios propuestos. La idea es formalizar algunas de las ideas que ya han sido presentadas anteriormente y agregar nuevos conocimientos, incluyendo las funciones más utilizadas a la hora de trabajar con este tipo de dato.

En este artículo se presentan una serie de ejemplos. Pueden encontrar cada uno de ellos en un único archivo de código fuente en el este enlace. La salida, es decir, el código ya interpretado lo pueden ver aquí.

Al final del artículo hay, como siempre, una serie de ejercicios propuestos cuya resolución publicaré en otro artículo.

Strings

Los strings o cadenas de caracteres son un tipo de dato de PHP, que al igual que en otros lenguajes, se utilizan para almacenar información en forma de texto. Están compuestos por uno o más caracteres, cada uno de los cuales tiene siempre un mismo código asignado que puede encontrarse en la tabla ASCII.

En el sitio web ASCII Table pueden encontrar los distintos códigos que existen. Tengan en cuenta que los primeros 32 son los llamados códigos de control y que luego sí, empiezan a aparecer los símbolos, letras y números. Hay también una tabla ASCII extendida, que agrega a la original caracteres adicionales como letras acentuadas y letras del alfabeto griego, entre otros símbolos.

La columna Dec de la tabla se refiere al código decimal del caracter, Hx al hexadecimal, Oct al octal y Html al HTML. Notarán que la columna Chr muestra el caracter en cuestión. En el caso de los de control, además se explica para qué sirve cada uno.

En PHP un string se puede definir de la siguiente manera, utilizando tanto comillas dobles como comillas simples.

Se puede mostrar por pantalla con echo, como lo hemos estado haciendo en todo el curso.

Salida

De la última instrucción podemos concluir que el punto sirve para concatenar las cadenas de caracteres. Además, no es necesario definirlas dentro de una variable para utilizarlas, ya que se pueden utilizar como literales, como se hace en el ejemplo con los saltos de línea de HTML, los <br />.

Comillas dobles y comillas simples

¿Cuál es la diferencia entre usar comillas dobles y simples? Que si incluimos variables dentro de cadenas con comillas dobles, estas serán identificadas por PHP y su valor será reemplazado. En cambio, con las comillas simples eso no ocurrirá. Veamos un ejemplo.

Salida

En el primer caso, la variable $nombre es interpretada por PHP y en el segundo no. Por lo tanto, en este último, se muestra el símbolo $ con el nombre de la variable como si fuera una parte común del texto. Si quisiéramos utilizar comillas simples y mostrar esa variable, deberíamos usar el punto para concatenar:

Tabla ASCII y caracteres de escape

¿Y qué ocurre si tenemos un string que tiene comillas dentro? Para lograr esto es necesario utilizar la barra invertida: . Se utiliza de la siguiente manera.

Salida

Este mismo caracter es también útil para hacer referencia a caracteres de la tabla ASCII. Por ejemplo, así:

Salida

Se pone el símbolo luego, con 0 se indica que se utilizará código octal y a continuación se pone el código de la tabla. Con x en lugar de 0 se puede indicar el código hexadecimal.

También se pueden añadir otros caracteres, como por ejemplo el de nueva línea n, tan usado en lenguajes como C. En PHP, si imprimimos en HTML, el caracter n no va a generar una nueva línea porque este código de marcas utiliza el conocido <br />. El \n sí funciona cuando usamos PHP CLI, es decir, el PHP que corre sobre línea de comandos. Sin embargo, cuando utilizamos las etiquetas <pre></pre> para texto preformateado, sí funciona.

Salida

De la misma forma se puede hacer lo mismo con otros caracteres escapados como t, y r,

Funciones ord y chr

Existen dos funciones muy útiles para trabajar con códigos de la tabla ASCII, ellas son ord y chr. Permiten obtener el código de un caracter dado el mismo caracter; o lo contrario, obtener el caracter en base a su código.

Salida

Como pueden ver, ord toma un caracter y devuelve su valor decimal en ASCII. Se puede utilizar con variables o con literales. Ahora veamos como funciona chr.

Salida

Es la contraparte de ord. Toma un número (en decimal) y en su lugar, devuelve el código ASCII que corresponde.

Strings como arrays

Las cadenas de caracteres pueden ser tratadas como arrays. Como están compuestos por una serie de caracteres, cada uno de ellos puede ser accedido como si fuera un elemento de un arreglo. La forma de hacer esto es mediante un índice y con la misma sintaxis que se usan en los arrays.

Salida

En este ejemplo se define un string y se lo muestra por pantalla con echo. Luego, se accede al caracter que corresponde a la posición 0 (una vez más, se empieza a contar desde 0), posteriormente a la 3 y finalmente a la 9. Estos índices se corresponden con las letras L, s y n del string definido.

Más abajo se hace una asignación. La posición 0 del string ahora pasa a contener la letra ‘M’. Al volver a imprimir por pantalla el string, se ve alterado.

De la misma forma que se puede asignar, se puede comparar. Esto puede ser útil para, por ejemplo, chequear con qué letra comienza un string.

Sintaxis Heredoc

Hay una forma más de definir los strings, mediante la sintaxis denominada Heredoc. Básicamente permite hacer lo mismo que las comillas dobles ya que las variables que se introduzcan serán interpretadas. Veamos su sintaxis en el siguiente ejemplo.

Primero definimos un string común y corriente mediante comillas simples (podrían ser dobles también). Abajo vamos a mostrar otro string. Para ello, se ponen los tres símbolos menor seguidos y luego una etiqueta en mayúsculas, que puede ser la que queramos. A continuación, se pone el contenido del string, teniendo en cuenta que las variables que se agreguen serán interpretadas. Finalmente, en la última línea, se añade nuevamente la etiqueta y se finaliza con un punto y coma. Esto último equivale a una etiqueta de cierre, para informar a PHP que se terminó el string.

Salida

Conversión de strings a números

Siendo PHP un lenguaje no tipado, las variables no necesitan declararse y el tipo de su contenido puede variar en la misma ejecución. Generalmente, las conversiones de tipo se hacen de forma automática aunque siempre hay que tener cuidado qué es lo que puede entender el lenguaje para no llevarse sorpresas.

Sin embargo, es posible forzar las conversiones en PHP, al igual que se hace en Java y en otros lenguajes. Esto se llama cast, o “casteo” si lo traducimos.

Para hacer esto, hay que agregar el tipo al que se quiere convertir entre paréntesis delante del string a convertir.

Salida

La primera salida produce un 45. Se está realizando una conversión a número entero, por eso se antepone (int) a la variable.

La segunda salida intenta convertir a decimal o flotante la variable $float_str anteponiendo (float). Pero no lo logra satisfactoriamente debido a que el símbolo que separa la parte entera de la fraccionaria es una coma y no un punto. PHP toma la parte que entiende hasta que aparece la coma, que le resulta extraña para un número. Así que descarta desde allí en adelante. El resultado, como ven, es 45.

Para la tercera salida ya estamos prevenidos así que en vez de utilizar una coma, separamos la parte entera de la fraccionaria con un punto. Ahora sí la conversión resulta como esperábamos.

Función strlen

Ahora comenzamos un breve repaso por las funciones más utilizadas a la hora de trabajar con strings. La primera es strlen, que lo que hace es devolver la cantidad de caracteres que tiene una cadena.

Salida

La función strlen recibe un único parámetro, una cadena de caracteres. No hay que olvidar que el primer elemento de un string tiene índice 0. Eso significa que el último caracter se corresponde con el número que devuelva strlen menos uno. Esto hay que tenerlo en cuenta cuando se recorren los strings caracter por caracter. No se irá de 1 a strlen($cadena), sino de 0 hasta strlen($cadena) – 1.

Funciones strcmp y strcasecmp

Ya hemos visto la función strcmp en este curso. La usamos, por ejemplo, en el ejercicio que hay que armar la tabla de posiciones (clasificaciones) dado un fixture de fútbol.

Se trata de la función que hay que utilizar a la hora de comparar dos strings. Recibe dos parámetros, las dos cadenas a comparar y devuelve un número que es la separación entre ambas. ¿Por qué un número? Porque los strings son convertidos a sus valores ASCII y se compara caracter por caracter. Esto es una gran ventaja porque dado el orden que tienen las letras en la tabla ASCII, es posible aprovechar esta función para saber si una cadena está antes que otra alfabéticamente.

Si tan solo nos interesa saber si dos cadenas son iguales, entonces podemos chequear si el resultado devuelto por strcmp es cero.

Veamos un ejemplo del comportamiento que tiene.

Vamos a definir tres strings distintos con nombres de países. El primero y el tercero son idénticos excepto por la primera letra que en el primero está en mayúscula y en el tercero en minúscula.

Si utilizamos strcmp con el string1 y el string2, comprobaremos que el resultado es 5. ¿De dónde sale ese 5? De la diferencia de los códigos ASCII de los primeros caracteres de ambas cadenas. El código ASCII de F es 70 y el de A, 65. Por lo tanto, la diferencia es 5. Si invirtiéramos los parámetros, el resultado sería -5. Si los dos primeros caracteres fueran iguales, entonces strcmp buscaría la diferencia en el siguiente.  Y si estos también fueran iguales, entonces seguiría con el que viene después y así sucesivamente. Si todos son iguales, entonces devuelve un 0.

En la segunda comparación, se usan como parámetros el string1 y el 3. La diferencia entre la F y la f minúscula es de 32 lugares, apareciendo primero el primer parámetro. Por lo tanto, el código de la f minúscula es mayor y el resultado de la comparación es negativo.

En la tercera comparación,  usamos strcasecmp, que hace exactamente lo mismo que strcmp, pero sin distinguir mayúsculas de minúsculas. Por lo tanto, para esta función, el string1 y el 3 son iguales. El resultado que arroja es 0.

Salida

El habitual uso de strcmp y strcasecmp es dentro de un if. En el siguiente código, verán que se utiliza el operador de comparación de identidad para asegurar que la comparación sea contra el número 0 y no contra un FALSE o un NULL.

La salida de este código es:

Funciones strpos, stripos y strrpos

Estas dos funciones contribuyen en la tarea de realizar búsquedas dentro de cadenas de caracteres. Llevan dos parámetros, primero el string en el cual se desea realizar una búsqueda (en el manual de PHP se lo suele llamar haystack) y luego, el string que se quiere buscar (llamado needle o aguja). Si el segundo parámetro está incluido en el string del primero, entonces las funciones devuelven un número entero que se corresponde con la posición en que se encuentra, contando desde la número 0. Se devuelve FALSE si el segundo string no está dentro del primero.

En este código el haystack es $cadena y el needle es $buscar. En el if se utiliza strpos para ver si el segundo está dentro del primero. Se utiliza una vez más el comparador de identidad, en este caso para hacerlo distinto de FALSE. En base al resultado, se mostrará el mensaje que corresponde. Luego, se muestra la posición en la que se encuentra el string buscado.

Salida

Ahora veamos un ejemplo con stripos.

Ahora el string de la aguja tiene una mayúscula. stripos se diferencia de strpos en que no distingue mayúsculas de minúsculas. Es por eso que en el código de arriba, encontrará coincidencia, cuando su función hermana no lo haría.

La función strrpos funciona igual que strpos, pero en vez de recorrer el string de izquierda a derecha, lo hace de derecha a izquierda. Por lo tanto, la primera ocurrencia, si hay más de una, será la que esté más cerca del final del string. ¡Pero cuidado! El número de posición se sigue considerando desde el primer caracter de la izquierda. El siguiente ejemplo utiliza la misma variable $cadena que el anterior.

Salida

Si se recorre de derecha a izquierda, la primera aparición del string “e” es en la posición número 39.

Función substr

Con substr es posible obtener una parte de un string, es decir un sub string, de ahí el nombre de la función. Lleva tres parámetros: una cadena de caracteres, un número entero que indica la posición de inicio y otro número que indica cuántos caracteres se deben seleccionar. La función devuelve el sub string indicado. Vamos a verlo con un ejemplo.

Salida

Como ven, se toma una parte del string definido al principio. Si el tercer parámetro es negativo, entonces se cuenta desde la posición que indica el segundo, hacia atrás.

Funciones strstr y stristr

Estas dos funciones sirven para realizar búsquedas. strstr recibe dos parámetros, la cadena en la cual se va a buscar y la cadena que se desea encontrar. Si no hay coincidencia, devuelve una cadena vacía. En caso de que sí haya encontrado lo que se busca, devuelve la parte de la cadena desde la posición de la coincidencia hasta el final de la cadena del primer parámetro.

Salida

En la segunda búsqueda no encuentra nada por ser la función sensitiva a mayúsculas y minúsculas. Su contraparte es stristr.

Salida

Con stristr se pueden realizar búsquedas sin importar las mayúsculas y las minúsculas. En el ejemplo anterior, la función strstr no hubiera devuelto nada.

strspn y strcspn

Estas funciones sirven para comparar contra una máscara. Una máscara es un grupo de elementos, en este caso, de caracteres. De esta forma, podemos saber si alguno de los caracteres de la máscara está apareciendo en otro string. Esto es bastante útil a la hora de validar cadenas de caracteres. Es una forma de crear listas blancas y listas negras respecto a letras, números y símbolos.

Ambas funciones llevan dos parámetros: el string a chequear y la máscara, que también es otro string. strspn devuelve la longitud que corresponde al sub string que comienza en la posición 0 y termina en el que ya no aparecen caracteres de la máscara. Si el primer caracter del string no coincide con la máscara, devuelve 0. Es más fácil mostrar su funcionamiento con un ejemplo simple.

Salida

El string que se quiere verificar o validar es $cadena. La máscara es $permitidos. En la primera línea de salida, vemos que se devuelve el número 6. Y esto se explica de la siguiente manera: el primer número de la cadena es un 1 y está en la máscara, por lo tanto se empezará a contar desde ahí. El siguiente número es un 5, que también está en la máscara. Esto quiere decir que la longitud ya es 2. La función sigue buscando caracter por caracter hasta que encuentre uno que no pertenezca a la máscara. En este caso, esto ocurre cuando llega a “-“. En ese instante, interrumpe la búsqueda y devuelve la longitud desde el primer caracter que coincidía con la máscara hasta el primero que no coincide.

De nuevo, si el primer caracter no hubiera coincidido con la máscara, entonces hubiera devuelto 0 directamente.

En el segundo caso, la máscara cambia. Si ahora se recorre la cadena de izquierda a derecha, el primer caracter de la cadena está en la máscara, pero el segundo ya no. Por lo tanto, la longitud devuelta es 1.

Por su parte, strcspn es la función complementaria a strspn. Se encarga de chequear caracteres que no pertenezcan a la máscara. Es lo que se suele conocer como lista negra.

Salida

Se recorre el string $cadena desde el primer caracter hasta que se encuentre uno que pertenezca a la máscara. El primer caracter que pertenece es el “2”. La longitud devuelta es desde el primer caracter “H” hasta allí, es decir, 7.

Existe la posibilidad de añadir un tercer y cuarto parámetro de tipo entero ambos, para las dos funciones. De esta forma, es posible indicar un sub string de la cadena a explorar para hacer el chequeo, en vez de utilizarla por completo.

Funciones str_replace, str_ireplace y substr_replace

La familia de funciones str_replace sirven para buscar y reemplazar. Reciben tres parámetros. El primero es el string que se quiere buscar, el segundo es el string con el cual se lo quiere reemplazar y el tercero es sobre el cual se realiza la búsqueda y el reemplazo. Puede haber un cuarto parámetro que de usarse,  debe ser una variable. La función pondrá en esa variable el valor que corresponde a la cantidad de reemplazos realizados.

Se define un string $texto con una frase. A continuación, se define la cadena a buscar y luego, el string que la reemplazará. Se pasan estas tres variables como parámetros a la función str_replace en el orden indicado anteriormente y además, se añade la variable $num que almacenará la cantidad de reemplazos.

Salida

Veamos otro ejemplo donde hay más de un reemplazo

Aquí el string “o” debe ser reemplazado por el string “0″. Hay tres reemplazos para hacer y eso es lo que muestra la salida.

Salida

La función str_ireplace es igual, pero no distingue de mayúsculas y minúsculas. Por lo tanto, en el siguiente ejemplo pueden ver como “museo” es igual que “MuSeO” para esta función.

Salida

Por último, substr_replace es una combinación entre substr y str_replace. A los dos parámetros de búsqueda y reemplazo se le suman dos más para indicar inicio y fin de un sub string dentro de la cadena en la que se debe buscar. Si se pasa tercer parámetro no es necesario pasar un cuarto.

Salida

Función strtr

Esta función sirve para reemplazar caracteres por otros caracteres en los strings. No se debe confundir con strstr, que tiene un nombre parecido. strtr es muy útil para hacer procesos de transliteración. Tiene dos modos de uso. Con un caracter o con varios. Veamos el primer caso.

La función lleva tres parámetros. El primero es el string sobre el cual se realiza está búsqueda. El segundo es el caracter a reemplazar y el tercero es el caracter con el que se quiere hacerlo. La función sustituirá el primero con el segundo en cada una de sus ocurrencias.

Salida

La otra forma de usarlo es sustituyendo varios caracteres al mismo tiempo. Para eso es necesario utilizar un array.

Salida

Se define un array donde las claves son los caracteres a reemplazar y cada uno de sus valores corresponden a los caracteres que los sustituirán. Luego, se pasa el array como segundo parámetro.

Salida por pantalla formateada

Para cerrar esta clase, vamos a ver la función printf. Esta función debe ser muy conocida para muchos, especialmente para los que hayan programado en el lenguaje C. Se podría hacer todo un artículo sobre printf, pero en este apartado voy a resumir lo más importante.

El objetivo que tiene es imprimir por pantalla, al igual que echo, pero con opciones mucho más sofisticadas. Empecemos viendo como se pueden mostrar números.

Se define un número entero con el valor 1250. En la primera línea, vemos por primera vez la función printf. El primer parámetro es un string y los sucesivos parámetros son todos valores que se quieren introducir en él. Estos pueden ser números o también strings. Se insertan en los lugares donde aparece el símbolo %. La letra que le sigue al símbolo indica en qué formato debe ser mostrado. “%d” significa decimal, “%b” binario, “%o” octal y “%x” hexadecimal.

Salida

Con %s se pueden imprimir strings:

Salida

En el caso de los números, es posible agregarle formato a la salida. A continuación lo vemos con los números decimales o de punto flotante.

Salida

El punto luego del símbolo % permite definir cuántos decimales se mostrarán. Esta es una de las varias opciones que dispone la función printf.

Resta ver que ocurrirá cuando tengamos varios parámetros para mostrar.

Cada % se corresponde en orden con el valor de una de las variables que van como parámetro.

Salida

Además de printf, existe también sprintf que hace lo mismo pero no para imprimir por pantalla sino para asignar a otra variable.

Salida

Conclusiones

Los strings son una parte muy importante de PHP, como también de cualquier otro lenguaje. Es importante dominarlos, pues las funciones con las que se pueden manipular son la base de las mayoría de los procedimientos de validación de datos.

PHP dispone de muchas funciones que facilitan el trabajo con las cadenas de caracteres. Quizás las más usadas son strlen, strpos, strcmp y substr. Sin embargo, lo ideal es conocerlas todas y tenerlas presentes para poder usarlas en cualquier momento.

Ejercicios propuestos

  1. Realizar un programa en PHP que dado un texto, cuente qué cantidad hay de cada vocal y lo muestre por pantalla.
    Ej: a: 4 / e: 2 /  i: 1 / o: 9 / u: 3
  2. Se necesita validar una cadena de caracteres que representa un nombre de usuario. No debe tener menos de 8 caracteres ni más de 12. Además, no puede empezar con un número. Informar el resultado de la validacion por pantalla. Ej válidos: Pepegrillo3, V1olet_73. Ej inválidos: 3atman_45, the_great_warrior.
  3. Realizar un programa que dado un texto cuente la cantidad de apariciones de la palabra “de”
  4. Dado el siguiente texto, que por error fue mal procesado, buscar y reemplazar cada ocurrencia de “ko” y reemplazarlo por “no”: “El ko sabe que ningun casiko esta cercako”
  5. Se desea validar una variable del tipo string que representa un numero de teléfono. Debe tener el formato NNNN-NNNN donde N es un digito del 0 al 9. Informar el resultado de la validación por pantalla.
  6. Se dispone de una lista de productos en una array. Cada ítem es representado por un código del formato CNNNNCCC donde C es un caracter alfabético y N es un número del 0 al 9.
    El array es el siguiente:
    $productos = array (‘A4578NUR’, ‘C4587MKL’, ‘L0349MSA’, ‘C1250PQA’, ‘F7541RES’, ‘I5600PLU’);
    Se pide actualizar la parte numérica de cada ítem, sumándole 1000. Luego de procesar toda la lista, mostrarla por pantalla.

Bibliografía

  • Zend PHP5 Certification Study Guide de Davey Shafik con Ben Ramsey, php architect nanobooks
Soy programador web y me desempeño como Líder Técnico en Polar Bear Development. Trabajo con tecnologías como PHP, Javascript, MySQL y HTML5 para el desarrollo de sitios y sistemas web. Me especializo en Zend Framework 2 y otros frameworks MVC, como también en WordPress y otros CMS. Lidero equipos de desarrolladores trabajando con Scrum. Vivo en Buenos Aires, Argentina.
 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


*