Ayuda con cadenas de texto
Escrito el 24/April/2008 por juan_belon
Todo sobre cadenas de texto
Introducción
Vamos a aprender como encontrar, transformar y borrar palabras ya que es algo así como una tarea esencial de todo ingeniero de aplicaciones web que se precie.Además tomaremos consciencia de los métodos usados para ahorrarnos escribir texto de entrada/salida en nuestras aplicaciones a la hora de crear mecanismos automáticos con los que operar en nuestras aplicaciones.
Verás funciones de este artículo que son bastante simples pero se mencionan por si nunca antes las habias visto, lo estamos haciendo fácil para todos. Las funciones más complejas usan expresiones regulares, una parte muy potente de PHP que todo programador ha de conocer.
Extraer parte de una cadena
El problema de un buscador es que se suele buscar en formas plurales y los programadores dándonos cuenta de esto, tenemos que ingeníarnoslas para procesar el texto y hacer que el usuario encuentre lo que busca en la base de datos. Para eliminar las ‘s' de una cadena se puede utilizar la función substr(cadena, inicio, fin) de forma que podemos comprobar si la última letra se debe eliminar con un básico:
if (susbstr( cadena, -1, 1)=='s')
Una vez que has encontrado una subcadena que te interesa hay una serie de operaciones que puedes realizar con ella:
- Reasignar una porción específica de la cadena usando substr() para eliminar los caracteres que sobran.
Ejemplo: $cadena = substr($cadena, 0, 10);
Lo que hace es poner en $cadena los 10 primeros caracteres de $cadena,empezando por el primero. - Eliminar los últimos N caracteres con substring y strlen().
Ejemplo: $cadena = substr($cadena,0 ,strlen($cadena)-3);
Guarda en $cadena todos los caracteres menos los 3 últimos. - Reemplazar caracteres con substr_replace(cadena_original, cadena_reemplazo,inicio, longitud) que permite especificar una subcadena y reemplazarla con otra, por ejemplo:
$cadena = substr_replace('abcdef','bbb',1,2)
guarda en $cadena la cadena ‘abbbdef'
Operaciones con Mayúsculas y Minúsculas
Un problema que puede surgir con PHP y MySQL es que este sistema gestor de bases de datos es sensible a mayúsculas pero soporta campos que no lo son, sin embargo, las cadenas en PHP son sensibles a mayúsculas, asi que prentendemos asegurar que no habrá malentendidos entre ambos y que nos vamos a llevar bien
Para ello disponemos de una consulta MySQL donde no hay diferencia entre Juan y JUAN , sin embargo en PHP son dos cadenas distintas, asi que necesitamos pasar toda la cadena en este lenguaje a mayúsculas antes de compararlas o imprimirlas por pantalla.
PHP tiene varias funciones esenciales para realizar este tipo de tareas:
- strtolower(): pasa toda la cadena a minúsculas
- strtoupper(): pasa toda la cadena a mayúsculas
- ucwords(): convierte la primera letra de cada palabra de la cadena a mayúsculas
- ucfirst(): convierte la primera letra la cadena a mayúsculas
Ejemplo
<?php$cadena = "HOla qUe Tal CoMo EstAs?";
echo strtoupper($cadena);
//imprime "HOLA QUE TAL COMO ESTAS?"
echo strtolower($cadena);
//imprime "hola que tal como estas?"
echo ucwords(strtolower($cadena));
//usando un truquito para pasar primero la cadena a min�sculas
//imprime "Hola Que Tal Como Estas?"
echo ucfirst(strtolower($cadena));
//imprime "Hola que tal como estas?"
?>
Hemos de tener en cuenta que si nuestra cadena tiene letras separadas por otros caracteres que no sean un espacio,se interpretan como una única palabra, es decir, juan-belon se interpreta como una sóla palabra, para realizar este tipo de conversiones a palabras en esta forma necesitamos crear una expresión regular que detecte dicho formato o algo más fácil,como construir una lista en un array y pasárselo a la función str_replace() como argumento para reemplazarlo. Ejemplo de conversiones que no queremos que se hagan:
<?phpfunction formatear_titulo($cadena){
//Primero el array de palabras que no queremos que se pasen a may�sculas, pronombres,preposiciones,etc.
$mayusculas = array("De","A ","El ","La ","Y ","Un ","Una ","O ");
//Ahora el conjunto de reemplazos, en el mismo orden!!
$minusculas = array("de ","a ","el ", "la ","y ","un ","una ","o ");
$cadena = ucwords(strtolower($cadena));
$cadena = str_replace($mayusculas, $minusculas, $cadena);
//Ahora devolvemos la cadena con la primera letra en may�scula:
return ucfirst($cadena);
}
?>
Debemos tener en cuenta que como en el caso anterior, si teníamos una cadena como Juan-Belon, la función ucwords(strtolower()) ha eliminado su mayúscula en Belon, si es importante preservar dichas capitalizacionese entonces puedes usar una comparación mediante la función strcasecmp(cadena1, cadena2);
Encontrar subcadenas
PHP tiene bastantes funciones que permiten encontrar subcadenas en una cadena dada. La elección depende de lo que quieras hacer con el resultado. Algunas funciones básicas:
- strpos():
encuetra la posición de la primera ocurriencia de la subcadena pasada - strrpos(): encuentra la posición de la última ocurrencia de la subcadena proporcionada, en la cadena pasada como argumento. A partir de dicha posición se puede extraer el contenido restante con substr() ,o se puede hacer con la siguiente función
- strstr(): devuelve todo lo que hay después de la primera ocurrencia de la subcadena dada
Estas funciones devuelve False si la subcadena no se encuentra presente en la cadena original, hay que llevar cuidado pues la primera ocurrencia puede estar en la posición 0 de la cadena, lo que se puede interpretar como un valor False usado en un condicional, es por eso que debemos usar "===false" en lugar de "==false".
La triple igualdad asegura que los valores y los tipos de los términos del operador de comparación son los mismos, es importante porque puedes obtener valores no esperados como resultado de una comparación.
Veamos un ejemplo:
<?php$cadena = "Yo apruebo todas mis asignaturas porque estudio lo suficiente en mi estudio particular";
$termino = "estudio";
//Aparece el término en la cadena?
$pos = strpos($cadena, "estudio");
if ($pos === false){
echo "No se ha encontrado el término ‘$termino' en la cadena ‘$cadena'";
} else {
echo "Se ha encontrado el el término ‘$termino' en la cadena ‘$cadena' en la posición: $pos<br>";
echo "Última posición:".strval(strrpos($cadena, $termino))."<br>";
echo strstr($cadena, $termino)."\n";
//Imprime desde el primer "estudio":
echo substr($cadena, strrpos($cadena,$termino))."<br>";
//Imprime "estudio particular"
}
?>
Recordar que estas funciones son sensibles a mayúsculas, y que se están comparando subcadenas, no palabras, para ello necesitamos construir una expresión regular.
Reemplazar texto es muy útil, de hecho se puede construir un sistema de plantillas con la función str_replace super rápido…
Ahora vamos a ver un pequeño ejemplo de esto…
Notación "Camello"
Esta notación se utiliza para convertir nombres usados en un programa en nombres para mostrar por la pantalla del usuario.
Algunos frameworks (conjunto de librerias de programación) utilizan mecanismos en clases para pluralizar palabras y formas verbales…aunque algunas veces estos mecanismos transparentes resultan de lo más complicado de entender gracias a los comicos nombres y formas, como "camellizar" y otras parodias XD
<?php/**
* Pasa de formato Camel a texto que se puede leer por un humano
* @param str $cadena
* @return str
*/
function humanizar($cadena) {
return ucfirst(preg_replace(‘/([a-z])([A-Z])/', ‘\1 \2′, $cadena));
}
/**
* Pasa una cadena a texto en notación "Camel" para usarla en un programa
* @param str $cadena
* @return str
*/
function camellizar($cadena) {
if (!isset($cadena[0])) {
return ";
}
$cadena = ucwords(strtolower($cadena));
$cadena = preg_replace(‘/[^a-zA-Z0-9]/', ", $cadena);
$cadena[0] = strtolower($cadena[0]);
return $cadena;
}
?>
El término CamelCase describe la apariencia de las PalabrasEnCodigo. Varias palabras unidas sin espacios entre sí, mezclando mayúsculas y minúsculas. Las letras mayúsculas y minúsculas se asemejan a las jorobas de un camello, de ahi lo del animalillo XD
Veamos un ejemplo de uso:
<?php echo humanizar(‘ejemploTextoCamello');
// Salida: Ejemplo Texto Camello
echo humanizar(‘nombreProducto');
// Salida: Nombre Producto
echo camellizar(‘Ejemplo Texto Camello');
// Salida: ejemploTextoCamello
echo camellizar(‘Nombre - Producto');
// Salida: nombreProducto
?>
Expresiones Regulares
El tema de las expresiones regulares se sale un poco del tratamiento de cadenas y es algo un poco más complejo que ha de ser tomado con cautela para comprenderlo…
Algunos ejemplos más podeis verlos en :
- Compactadores de HTML
- Filtros para guardar ficheros: $fichero = ereg_replace('(([^0-9a-zA-Z_\.])+)', "",basename($f[$i]));
- Filtros para comprobar que una cadena es un correo electrónico:
<?php
/*** Utiliza una expresion regular para comprobar que el $correo pasado es realmente un correo electronico
*
* @param str $correo
* @return bool
*/
function zen_es_correo($correo){
return preg_match(
‘/^[\ a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,6}$/i',
$correo
);
}
?>
- Funciones para procesar fechas
etc.
Seguir las respuestas con el canal RSS 2.0 para ello. Puedes dejar un comentario, o trackback copiar a tu sitio.