Introducción - CADENAS
Si pensamos en los tipos de datos que circulan por la red, llegaremos a la
conclusión de que una gran porción la ocupan las imágenes, animaciones
en Macromedia Flash, videos o subprogramas escritos en Java. La otra gran
porción, mayoritaria, son los textos o las cadenas de caracteres.
Las cadenas de caracteres o string son secuencias de caracteres que pueden
ser tratadas como una unidad, asignadas a variables, pasadas como
parámetros a funciones o enviadas como salida al navegador. Un string se
diferencia de otro tipo de dato en PHP 5, porque va encerrado entre comillas
dobles ( ") o simples ( ' ) .
"Cadena entre comillas dobles"
'Cadena entre comillas simples'
PHP interpreta de distinta forma las cadenas que van entre comillas dobles
y las que van entre comillas simples. Losstrings entre comillas dobles
pueden sustituir ciertos símbolos por acciones, como la inclusión del valor
de una variable. Las comillas simples, simplemente muestran todo el
contenido, sin atender a caracteres especiales. Podemos ver un ejemplo
donde sucede esto:
<?php
$variable = "Domingo";
$frase_l = "Hoy es $variable, el cielo está gris";
$frase_2 = 'Hoy es $variable, el cielo está gris';
echo $frase_l;
echo $frase_2;
?>
El resultado en el navegador es:
Hoy es Domingo, el cielo está gris
Hoy es $variable, el cielo está gris
Como se puede observar, la cadena $f r a s e _ l es capaz de sustituir la variable
por su valor, por el simple hecho de estar entre comillas dobles.
Propiedades de las cadenas
índices de string
Si pensamos en las cadenas como una sucesión de caracteres en un orden
determinado, podemos llegar a desear acceder libremente a parte de los caracteres. Esto es posible gracias a los símbolos de llave ({ } ) y un índice
numérico que se corresponderá con la posición del carácter que buscamos.
El ejemplo muestra cómo crear una función que duplica las letras de una
cadena aprovechando esta forma de acceder a los caracteres:
<?php
function duplicar_caracteres($cadena) {
$tamanio = strlen ($cadena) ;
$cadena_auxiliar = "";
for ($x = 0;$x < $tamanio; $x++) {
$cadena_auxiliar = $cadena_auxiliar . $cadena{$x}
$cadena{$x};
}
return $cadena_auxiliar;
}
$cadena = "Duplicar las letras";
echo duplicar_caracteres($cadena)¡
?>
Operadores
En este punto, aprovecharemos para hacer un breve repaso de los operadores
de string vistos en el capítulo 3. En otros lenguajes, como Java, se
utiliza el operador suma (+) para unir dos cadenas. En PHP este mismo
resultado se obtiene con el operador punto (. ). Así, podemos concatenar
varias cadenas de la forma siguiente:
<?php
$cadenal = "Hola";
$cadena2 = "Mundo";
$cadena3 = "¡Qué típico!";
$supercadena = $cadenal . " " . $cadena2 . " " . $cadena3;
echo $supercadena;
?>
Es fácil intuir que el operador puede concatenar caracteres y variables de
tipo string de forma conjunta. Es posible que desee ahora añadir texto a
una cadena ya existente; esto se puede hacer de dos formas muy similares.
La primera es asignando a la variable su valor más el valor a añadir,
de la siguiente forma:
<?php
$cadenal = "Hola";
$cadena2 = "Mundo";
$cadenal = $cadenal . $cadena2;
echo $cadenal;
?>
O utilizando el operador de concatenación y asignación ( .= ), como en el
ejemplo:
<?php
$cadenal = "Hola";
'$cadena2 = "Mundo";
$cadenal .= $cadena2;
echo $cadenal;
?>
Sintaxis para múltiples líneas
Existe en PHP una forma más de introducir cadenas, aparte de las comillas,
muy recomendable para largos textos o un considerable conjunto de
etiquetas HTML. La sintaxis es muy sencilla y comienza con el operador
(<<<) seguido de una etiqueta que indica el principio del texto. Después
de esto podemos escribir un conjunto de caracteres muy numerosos y, para finalizar, la etiqueta de fin. El ejemplo muestra cómo almacenar un formulario
en una variable:
<?php
$formulario = <<<INICIO
<form>
<ínput type="text" name="Nombre" value="Luís Miguel Cabezas">
<br>
<input type="submit" name="submit" value="Enviar" >
</form>
INICIO;
echo $formulario;
?>
Siempre debe comenzar por el operador (<<<), seguido de un identificador,
por ejemplo INICIO. Después se incluye el texto, en este caso un formulario
y, para finalizar, la misma etiqueta de inicio. Esta forma de
almacenar datos permite utilizar indistintamente comillas simples o dobles
dentro de una variable.
Funciones de string
Si conoce el lenguaje C, podrá comprobar que las funciones de manejo de
caracteres son muy parecidas en nombre y uso. Los desarrolladores de PHP siempre han querido que exista esta similitud para facilitar el aprendizaje
del lenguaje.
La mayoría de las funciones existentes en PHP 5 tienen una homologa en
C.
Tamaño de la cadena
La función s t r l e n () devuelve como resultado el tamaño en caracteres
de la cadena que pasemos de parámetro. Este valor puede asignarse a una
variable, como indica el ejemplo:
<?php
$cadena = "Esta cadena tiene muchas letras";
$numero_letras = strlen($cadena);
echo "cadena tiene $numero_letras caracteres";
?>
Simplemente imprime:
cadena tiene 31 caracteres
Posición de los caracteres
Para crear buenos motores de búsqueda en nuestros sitios Web, necesitaremos
potentes herramientas que sean capaces de buscar caracteres, cadenas
o patrones coincidentes dentro de textos extensos.
La función s t r p o s () encuentra en un string la posición de un carácter
determinado.
<?php
$cadena = "Esta cadena tiene muchas letras";
echo "La primera ocurrencia de 'a' es " . strpos($cadena, "a")
"<br>";
echo "La primera ocurrencia de 'm' es " . strpos($cadena, "m")
" <br>";
?>
La salida en el navegador no es otra que:
La primera ocurrencia de 'a' es 3
La primera ocurrencia de 'm' es 18
Si s t r p o s () se utiliza para averiguar la posición de la primera "L" mayúscula
de $ cadena vemos que nos devuelve un 0; esto es así porque el
índice de caracteres comienza en 0, como pasa en muchos lenguajes de
programación. Si no se encuentra ninguna ocurrencia del carácter buscado
el resultado será/a/se.
La función s t r p o s () también puede utilizarse para buscar varios caracteres
seguidos en una misma cadena:
<?php
$cadena = "Esta cadena tiene muchas letras";
echo "La primera ocurrencia de 'tiene' es " .
strpos($cadena,"tiene") . "<br>";
?>
Si lo que nos interesa es encontrar caracteres buscando desde el final de la
cadena la función que tenemos que utilizar es s t r r p o s () (la letra r que
se añade viene del inglés reverse). El ejemplo anterior nos sirve para comprobar
el funcionamiento de la función:
<?php
$cadena = "Esta cadena tiene muchas letras";
echo "La primera ocurrencia de 'a' es " . strpos($cadena, "a" )
"<br>";
echo "La primera ocurrencia desde atrás de 'a' es " .
strrpos($cadena, "a") . "<br>";
?>
siendo el resultado:
La primera ocurrencia de 'a' es 3
La primera ocurrencia desde atrás de 'a' es 29
Comparación
El operador (==) nos puede servir para evaluar si dos cadenas de caracteres
son iguales dentro de una estructura de control. Además, tenemos la
función strcmp ( ) , que compara bit a bit dos cadenas de caracteres. Atendiendo
al valor de salida de la función, podemos obtener los siguientes
resultados:
• Si el valor que se obtiene es 0, las dos cadenas son exactamente igual.
• Si obtenemos un valor negativo, el primer string es más pequeño que
el segundo.
• Si obtenemos un valor positivo, el primer string es más grande que el
segundo.
<?php
$cadenal = "Prueba";
$cadena2 = "Prueba";
if (strcmp($cadenal,$cadena2) == 0) {
echo "Las dos cadenas son iguales";
} elseif (strcmp($cadenal,$cadena2) < 0) {
echo "La cadenal es menor que la cadena2";
} else {
echo "La cadenal es mayor que la cadena2" ;
}
?>
La comparación anterior sólo da como resultado "dos cadenas iguales", si
las dos cadenas son exactamente iguales, haciendo distinción entre mayúsculas
y minúsculas.
Para evitar este problema podemos utilizar la función s t r c a s e c m p ( ),
que no es sensible a mayúsculas. Así s t r c a s e c m p ("HoLa" , "hOlA")
da como resultado 0, es decir, las dos cadenas son iguales.
Búsqueda de caracteres
Siguiendo con las búsquedas de texto, la función s t r s t r () recibe como
parámetros una cadena de caracteres donde buscar y otra con un conjunto
de caracteres que queremos encontrar. Si se encuentra el patrón de búsqueda,
el resultado será una cadena de caracteres que comenzará justo en
el patrón, hasta el final del string primero. Si no se encuentra el patrón el
resultado seráfalse.
< ?php
$cadena = "Esta cadena tiene muchas letras";
echo "La primera ocurrencia de 'cadena' es: " .
strstr ($cadena,"cadena") . "<br>";
?>
Como cabe esperar, el resultado es:
La primera ocurrencia de 'cadena' es: cadena tiene muchas
letras
Selección de subcadenas
La función s u b s t r () permite seleccionar un conjunto de caracteres de
una cadena, quedando intacto el string original. Puede tomar varios parámetros:
• s u b s t r (cadena, í n d i c e ) : Cadena es el conjunto de caracteres que
queremos cortar e í n d i c e la posición a partir de la cual se cortará la
cadena hasta el final.
• s u b s t r (cadena , í n d i c e , numero) : Cadena es el conjunto de caracteres
que queremos cortar e í n d i c e la posición a partir de la cual
se cortará la cadena tantas posiciones como indique el número.
Por ejemplo:
<?php
$cadena = "Esta cadena tiene muchas letras";
//Devuelve la cadena completa
echo substr($cadena, 0);
echo "<br>";
//Desde el carácter 12 hasta el final
echo substr($cadena, 12);
echo "<br>";
//Devuelve 6 caracteres desde el carácter 18
echo substr($cadena, 18,6);
echo "<br>";
//Devuelve los 6 últimos caracteres
echo substr($cadena, -6);
echo "<br>";
//Desde la posición 26, contando desde atrás, 6 caracteres
echo substr($cadena, -26,6);
echo "<br>";
//Empezando en el carácter 4 y terminando en el 7 desde atrás
echo substr($cadena, 4,-7);
?>
Sustitución de cadenas
La función s t r _ r e p l a c e () toma como parámetros un conjunto de caracteres
a buscar, un grupo que debe sustituirse por el anterior y una cadena
de caracteres sobre la que actuar.
<?php
$cadena = "Esta cadena tiene muchas letras";
$cadena = str_replace("Esta","Este",$cadena);
echo str_replace("cadena","conjunto",$cadena);
?>
Si en la cadena existiera más de una instancia del conjunto buscado, todas
las ocurrencias quedarían cambiadas.
<?php
{cadena = "Esta cadena tiene muchas letras y cadenas";
$cadena = str_replacé("Esta","Este",$cadena);
echo str^replace("cadena","conjunto",$cadena);
?>
El resultado es:
Este conjunto tiene muchas letras y conjuntos
Truco:
Puede probar esta función para cambiar todos ¡os caracteres de
un tipo de una cadena de ¡a siguiente forma: s t r _ r e p l a ce
("h", " j " , "hola h o l a " ).
Funciones de mayúscula y minúscula
Las funciones strtolower () y strtoupper () devuelven la cadena que
se pasa como argumento, completamente en minúscula o mayúscula respectivamente.
<?php
$cadena = "Hay palabras en MAYÚSCULAS y en minúsculas<br>" ;
echo strtolower($cadena) ;
echo strtoupper($cadena);
?>
El resultado es:
hay palabras en mayúsculas y en minúsculas
HAY PALABRAS EN MAYÚSCULAS Y EN MINÚSCULAS
Si lo que realmente nos interesa es que la primera letra de un texto aparezca
como letra Capital o, que letras iniciales de cada palabra en una frase aparezcan en mayúscula, tenemos las funciones u c f i r s t ( ) y
u c w o r d s ( ) .
<?php
$cadena = "había una vez...<br>";
echo ucfirst($cadena);
$cadena2 = "linux user group";
echo "LUG significa " . ucwords($cadena2) ;
?>
Expresiones regulares
Las funciones vistas anteriormente basan su potencia en la búsqueda o sustitución
de los caracteres de una cadena, pero son poco útiles cuando tratamos
de comprobar si un conjunto de caracteres cumple un formato
determinado. Si solicitamos mediante un formulario un correo electrónico,
necesitamos saber, a priori, si ese correo por lo menos está bien construido:
luis@nccextremadura.org
luis@zend.com
La idea es poder descartar de alguna forma los correos escritos de esta
manera:
l u i s (Snccextremadura.org //Espacio en medio
LUIS@zend.com //En mayúsculas
luis@@aupex.org //Dos @
Las expresiones regulares son patrones de búsqueda dentro de cadenas.
Estos patrones se construyen mediante caracteres especiales que cumplen
unas reglas determinadas.
| aabb |
Los caracteres no especiales, como un grupo de letras, se escriben como de costumbre. |
| A |
Indica que hay que buscar el patrón desde el principio de la cadena. |
| $ |
Este simbolo obliga al patrón a cumplirse hasta el final de la
cadena. Simboliza cualquier carácter. |
| * |
Indica que puede haber O o más instancias de una expresión. |
| + |
Indica que puede haber 1 o más instancias de una expresión. |
| [ab] |
Indica que se puede encontrar el carácter a o el b y la expresiónsería correcta. Lo podemos acompañar de [ab] * para evaluar si hay varias letras seguidas del tipo a o b. |
| [a-z] |
Indica que se puede elegir entre un rango de caracteres que va desde la a hasta la z. |
| \ |
Si queremos utilizar cualquiera de los anteriores caracteres como parte del patrón tendremos que utilizar éste símbolo para indicarle a PHP que es un literal. |
Como ejemplo vamos a intentar hacer un patrón que verifique si un correo
electrónico está correctamente construido o no. Sería fácil pensar en
una expresión parecida a la siguiente:
[ a - z ] + @ [ a - z ] + \ . o rg
La primera parte, [a-z] +, nos dice que aceptará una letra, o conjunto de
letras, sin espacios y en minúsculas, que pueden corresponderse con el
nombre de usuario de la cuenta de correo. Después aceptará un símbolo
@, seguido de otro conjunto de caracteres, correspondientes al servidor de
correo. La última parte de la expresión la componen los símbolos \ ., que
indican que tiene que aparecer un punto que separe la descripción del
servidor del dominio y la cadena o r g , que obliga a que todos los correos
sean de dominio no gubernamental.
La expresión anterior tiene algunas limitaciones, que veremos como solventar.
La primera es que se puede aplicar a cualquier texto, con independencia
del tamaño. Si en alguna parte de ese texto aparece un conjunto de
caracteres que cumpla con la expresión, la validación sería true. Esto no es
bueno cuando queremos chequear si un correo es introducido correctamente.
La solución es aplicar las reglas de inicio y fin que obligan a que el
comienzo de la cadena y el final sean parte de la expresión.
[ a - z ]+@[ a - 2 ] + \ . o r g$
También podemos encontrarnos con que existen correos introducidos correctamente, pero el dominio es otro distinto a org. Esta vez la solución es introducir el operador O lógico |, que permite elegir entre varias opciones:
^ [ a - z ] +@ [ a - z ] + \ . ( o r g | c o m | n e t )$
Por último, un problema menor, aunque habitual en el ámbito de los correos
electrónicos, es la utilización de signos de puntuación para separar
nombres y apellidos y servidores de servidores virtuales. Por ejemplo, el
correo siguiente es correcto, pero no sería evaluado por la expresión anterior:
luís.cabezas@ncc.aupex.org
Una posible solución es:
* [ a - z | \ . ] + @ [ a - z | \ . ] + \ . ( o r g | c o m ( n e t ) $
Comprobar expresiones regulares
La función ereg () es capaz de comprobar si una cadena se corresponde
con el patrón que se pasa como parámetro. Toma dos argumentos obligatorios,
una expresión regular y una cadena de caracteres donde buscar el
patrón. Seguidamente puede ver un ejemplo completo de utilización de
expresiones regulares y la función:
<?php
$correo = "luis.cabezas@ncc.aupex.org";
$correol = "LUIS@ncc.aupex.org";
$correo2 = "lu@is.cabezas@ncc.aupex.org";
if (ereg ("* [a-z|\.]+@[a-z|\.]+\. (org|com|net)$",$correo)) {
echo "El correo $correo se acepta.<br>";
} else {
echo "El correo $correo no cumple el patrón.<br>";
}
íf (ereg("^ [a-z|\.]+@ [a-z|\.]+\. (org|comjnet)$",$correol) ) {
echo "El correo $correol se acepta.<br>";
}else {
echo "El correo $correol no cumple el patrón.<br>";
}
if (ereg("A [a-zj\.]+@ [a-zj\.]+\. (org|com|net)$",$correo2)) {
echo "El correo $correo2 se acepta.<br>";
}else {
echo "El correo $correo2 no cumple el patrón.<br>";
}
?>
Puesto que hay muchos usuarios acostumbrados a escribir su correo electrónico
completamente en mayúsculas, se hace necesario comprobar este
contratiempo también. Lo más rápido es utilizar la función e r e g i () , que
funciona exactamente igual que e r e g ( ) , pero no es sensible a mayúscula o
minúscula. El ejemplo anterior lo podemos arreglar de la siguiente forma:
<?php
$correo = "LUIS@ncc.aupex.org";
if (ereg(""[a-z|\.]+@[a-z|\.]+\.(org|com|net)$",$correo,$pepe)) {
echo "El correo $correo se acepta.<br>" ;
} else {
echo "El correo $correo no cumple el patrón.<br>";
}
?>
Reemplazar patrones
ereg_replace () y e r e g i _ r e p l a c e () tiene tres parámetros. El primero
es una expresión regular, el segundo un string por el que se cambiarán
todas las ocurrencias del patrón y, por último, una cadena donde
buscar. Como antes, la diferencia entre las dos es únicamente que la primera
es sensible a mayúsculas. El siguiente ejemplo muestra el funcionamiento:
<?php
$texto = "El correo es de luis@ncc.aupex.org";
echo ereg_replace("[a-z|\.]+@[a-z|\.]+\.(org|com|net)","Luis
Miguel",$texto);
?>
Así da como resultado el cambio del correo electrónico por el nombre de
la persona asociada.
Resumen
Desde hace unos años se ha puesto de moda una serie de productos donde
prima el contenido frente al diseño. Los CMS (Content Manager System)
son programas, la mayoría escritos en PHP, que permiten gestionar mucho
contenido escrito por diferentes personas. El tratamiento de los textos
se agudiza al máximo en este caso, siendo indispensable la utilización de
expresiones regulares para verificar los datos nuevos que puedan incor- .
porarse.
Además, suelen llevar un buscador capaz de encontrar patrones determinados
dentro de las noticias expuestas.
Este capítulo le ha servido para conocer funciones para concatenar, recortar
o verificar cadenas. Con esto bien aprendido ya puede comenzar a crear
su propio CMS. |