DW03 CTES WEB - 05 - Strings y Archivos
-
Upload
carlos-loardo-condori -
Category
Documents
-
view
14 -
download
0
description
Transcript of DW03 CTES WEB - 05 - Strings y Archivos
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 1
FUNCIONES PARA STRINGS
Las funciones de manejo de texto corresponden con una librera de funciones que permitirn
procesar las cadenas de texto que levantemos de archivos de texto plano, de formularios o de
una base de datos.
LONGITUD DEL TEXTO:
strlen: Longitud de la cadena de texto, recibe como nico argumento un string.
str_word_count: Cantidad de palabras en el String, recibe como argumento un string.
$texto = "Este es mi texto de prueba";
$caracteres = strlen( $texto );
$ palabras = str_word_count( $texto );
echo "Hay $ palabras palabras con un largo de $caracteres caracteres";
MANEJO DE MAYUSCULAS/MINUSCULAS
ucfirst: 1era letra maysculas, recibe como nico argumento un string.
ucwords: 1era letra de cada palabra en maysculas, recibe como argumento un string.
strtoupper: Todo el texto a maysculas, recibe como nico argumento un string.
strtolower: Todo el texto a minsculas, recibe como nico argumento un string.
$texto1 = "este texto esta todo en minusculas\n";
$texto2 = "ESTE TEXTO ESTA TODO EN MAYUSCULAS\n";
echo "ucfirst: " . ucfirst( $texto1 );
echo "ucwords: " . ucwords( $texto1 );
echo "strtoupper:" . strtoupper( $texto1 );
echo "strtolower:" . strtolower( $texto2 );
//Esto no hace nada porque ya esta maysculas
echo "ucwords texto2: " . ucwords( $texto2 );
//Primero hay que pasarlo a minsculas
echo "ucwords + strtolower: ".ucwords(strtolower($texto2));
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 2
ETIQUETAS HTML
nl2br: Convertir todos los \n a , recibe como nico argumento un string.
htmlspecialchars: convertir todo carcter especial a entidad HTML.
htmlspecialchars_decode: Al revs del anterior, recibe como argumento un string.
htmlentities: similar a htmlspecialchars, salvo que TODO caracter que tenga una
entidad ser convertido (como acentos y ees), recibe como argumento un string.
htmlentities_decode: Paso inverso a htmlentities, recibe como argumento un string.
strip_tags: Eliminar toda etiqueta HTML, recibe como nico argumento un string.
$texto = "Malditas etiquetas HTML arruinan
mi diseo\n";
echo "Texto comun: ". $texto;
echo "htmlspecialchars: ". htmlspecialchars( $texto );
echo "htmlentities: ". htmlentities( $texto );
echo "strip_tags: ". strip_tags( $texto );
A simple vista tanto htmlspecialchars como htmlentities hicieron lo mismo, pero si miramos el
cdigo fuente, la segunda ha convertido tambin la de diseo a su entidad HTML ().
ESPACIOS DE MS
trim: Elimina espacios vacos de cada punta del String, recibe un argumento string.
ltrim: Elimina solo del left, recibe como nico argumento un string.
rtrim: Elimina solo del right, recibe como nico argumento un string.
$texto = " Una cadena de texto con espacios alrededor ";
var_dump( $texto );
var_dump( trim( $texto ) );
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 3
var_dump( ltrim( $texto ) );
var_dump( rtrim( $texto ) );
wordwrap: Ajusta el string a una cantidad fija de caracteres y hace un retorno de lnea.
Recibe cuatro argumentos. El primero es el string a cortar, el segundo la cantidad de
caracteres por cada lnea, el tercero el carcter que se usar para hacer el quiebre de las
cadenas de texto (por defecto es "\n").
El cuarto argumento es un booleano optativo, si es FALSE (valor por defecto) si una
palabra es ms larga que el segundo argumento, la completa y luego hace el salto de
lnea. Si se pone en TRUE, la palabra se corta en la cantidad de caracteres especificada.
echo "Cuatro argumento en false:\n";
echo wordwrap( $texto, 4, '', false ); //no fuerza el corte
echo "Cuatro argumento en true:\n";
echo wordwrap( $texto, 4, '', true );// quiebra las de palabras
ENCRIPTACIN:
Estas funciones se usan, principalmente, para encriptar claves y no guardarlas en formato
texto-plano.
En ambos casos, a misma cadena de texto de entrada, se producir la misma salida.
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 4
md5: Recibe como argumento un string y lo codifica en MD5 (32 caracteres en
hexadecimal), recibe como nico argumento un string.
sha1: Recibe un string y lo codifica en SHA1 (40 caracteres en hexadecimal), recibe
como nico argumento un string.
$pass1 = '1234';
$pass2 = '';
$pass3 = 'hola';
$pass4 = 'Hola';
echo "MD5 pass1: ". md5 ( $pass1 )."\n";
echo "SHA1 pass1: ". sha1( $pass1 )."\n";
echo "MD5 pass2: ". md5 ( $pass2 )."\n";
echo "SHA1 pass2: ". sha1( $pass2 )."\n";
echo "MD5 pass3: ". md5 ( $pass3 )."\n";
echo "SHA1 pass3: ". sha1( $pass3 )."\n";
echo "MD5 pass4: ". md5 ( $pass4 )."\n";
echo "SHA1 pass4: ". sha1( $pass4 )."\n";
BUSCAR / REEMPLAZAR CADENAS
strpos: busca una subcadena en una cadena principal, recibe dos argumentos: Qu
buscar y dnde hacer la bsqueda.
str_replace: Reemplaza una cadena por otra en un string. Recibe tres argumentos:
Qu buscamos, qu ponemos en su lugar y en qu cadena hacer el reemplazo.
stripos: Idem strpos pero case insensitive.
str_ireplace: Lo mismo que str_replace pero case insensitive
$buscar = "php";
$poner = "ASP no";
$nuevo_string = str_replace( $buscar, $poner, $texto );
echo "Original: " . $texto . "\n";
echo "Nuevo Str: " . $nuevo_string . "\n";
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 5
$texto = "Apunte de PHP. Porque php es fcil";
$pos1 = strpos( $texto , 'php' ); //case sensitive
$pos2 = stripos( $texto, 'php' ); //case insensitive
echo "strpos: " . $pos1. "\n";
echo "stripos: " . $pos2. "\n";
Si lo que buscamos no devuelve coincidencia se recibir FALSE.
$buscar = "ASP";
$pos3 = strpos( $texto , $buscar ); //ASP no existe.
echo "Resultado de buscas ASP: ";
var_dump( $pos3 );
Cabe recordar que el primer carcter es la posicin cero del string.
Si comparamos con doble igual cero y false son el mismo valor.
$buscar = "Apunte";
$pos4 = strpos( $texto , $buscar ); //Apunte aparece al principio.
echo "primera pos ". $pos4. "\n";
if( $pos3 == false ){
echo "Con doble igual NO se ha encontrado $buscar\n";
}else{
echo "Con doble igual SI se ha encontrado $buscar\n";
}
if( $pos3 === false ){
echo "Con triple igual NO se ha encontrado $buscar\n";
}else{
echo "Con triple igual SI se ha encontrado $buscar\n";
}
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 6
SISTEMA DE ARCHIVOS
PHP posee en su librera de funciones una lista de recursos para administrar los archivos y
carpetas de nuestro servidor, ya sea para leer sus contenidos, crear nuevos elementos o borrar
los existentes.
En la mayora de los casos, acceder a alguno de estos elementos genera un objeto de tipo
Resource (recurso), que se podra comparar con un acceso directo al objeto deseado.
De todo el listado de funciones existente, este documento se limita solo a explicar los que se
encargan de:
Comprobar si el elemento solicitado es una carpeta o un archivo.
Abrir y recorrer el listado de una carpeta (o directorio).
Verificar si existe un archivo en el servidor (por seguridad).
Leer/Escribir un archivo de texto plano (sin importar su extensin).
Borrar archivos.
En todos los casos mencionados anteriormente (salvo recorrer una carpeta) el nombre del
archivo o carpeta a manejar ser pasado como un simple string (una cadena de texto entre
comillas) que deber respetar toda la ruta a seguir para llegar desde el documento PHP al
archivo o carpeta destino.
MANEJO DE CARPETAS
Para leer el contenido de una carpeta, es necesario hacer uso de la funcin opendir( ) que
recibe como nico argumento la cadena de texto con el nombre de la carpeta. Esta funcin
devolver un objeto de tipo Resource (Recurso), que sera un acceso directo al contenido de la
carpeta
$carpeta = opendir( 'imagenes' );
//Accedo al directorio imagenes desde la variable $carpeta.
echo $carpeta;
//muestra Resource ID #3 el nmero puede ser distinto-
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 7
Si bien esa variable $carpeta no se puede mostrar directamente con un echo, tenemos que
pedirle que nos levante el contenido de la misma con la funcin readdir( ), que recibe entre
parntesis el Recurso generado anteriormente (la variable $carpeta ).
$carpeta = opendir( 'imagenes' );
$archivo = readdir( $carpeta ) ;
echo $archivo;
//Muestra el nombre del primer elemento adentro de la carpeta imgenes
Cada vez que se ejecute la instruccin readdir() el recurso se mover al archivo o carpeta
siguiente y devolver una cadena de texto conteniendo el nombre de archivo (insisto: no es el
archivo fsico, sino solo su nombre).
$carpeta = opendir( 'imagenes' );
// Accedo al recurso.
$archivo = readdir( $carpeta ) ;
//Me muevo un elemento en la carpeta.
echo $archivo;
//Muestra el nombre del primer elemento adentro de la carpeta imgenes.
$archivo = readdir( $carpeta ) ;
//Me muevo un elemento en la carpeta.
echo $archivo;
//Muestra el nombre del segundo elemento adentro de la carpeta imgenes.
De ms est decir que sera un absurdo escribir en el cdigo tantos readdir() y echo como
archivos tenga la carpeta, cuando la misma se puede recorrer con el uso de una estructura de
repeticin (do while).
Teniendo en cuenta que la diferencia funcional entre do y while (do ejecuta y despus verifica si
se debe repetir), usaremos while (ya que puede existir el riesgo de no tener NINGUN archivo
para mostrar).
En la condicin del ciclo de repeticin, haremos que por cada vuelta que se ejecute, guarde en
la una variable $archivo el nombre de CADA archivo.
Y entre cada llave, le pediremos que haga el echo de esa variable con el nombre de archivo.
$carpeta = opendir( 'imagenes' );
while( $archivo = readdir($carpeta ) ){
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 8
echo $archivo.'';
//Mostrar uno abajo del otro, los nombres de los archivos
}
La funcin readdir(), devolver el valor booleano false cuando ya no existan ms archivos
dentro de la carpeta recorrida, y dado que el while termina cuando el valor recibido es false,
la iteracin cortar automticamente sin necesidad de escribir nada adicional.
Luego, quedar a libertad del desarrollador si esa lista se muestra como una serie de vnculos
para que el usuario final pueda navegarlos, o si el dato recibido se mostrar como source de
una imagen (por ejemplo).
$carpeta = opendir( 'imagenes' );
while( $archivo = readdir($carpeta ) ){
echo '';
//muestro la etiqueta IMG del HTML, y le indico como src, que
muestre el nombre de archivo recibido, desde la carpeta imgenes
}
Cabe destacar que en el ejemplo anterior donde se pretende mostrar todas las fotos de la
carpeta imgenes, aparecern al principio dos fotos rotas, las mismas responden a dos
CARPETAS que se encuentran en todos los listados de directorio.
La primera es un punto ( . ) y representa la carpeta donde estamos parados en este momento.
La segunda son dos puntos seguidos ( .. ) y representa la accin de salir un nivel (a la carpeta
anterior o padre).
Para eliminar el error de las dos fotos rotas, podemos hacer dos cosas distintas:
1. Hacer el echo de la etiqueta IMG, solo si $archivo es distinto a . Y distinto a ...
2. Hacer el echo de la etiqueta IMG, solo si $archivo NO ES un directorio.
Para preguntar si $archivo es distinto a ambas carpetas, alcanza con hacer un if preguntando
por el valor de la variable:
$carpeta = opendir( 'imagenes' );
while( $archivo = readdir($carpeta ) ){
if( $archivo != '.' && $archivo != '..' ){
//si no es punto, y no es punto-punto, hago el echo.
echo '';
}
}
La segunda opcin se resuelve con la funcin is_dir( valor ); que devolver un booleano con
el valor true, si el valor recibido entre parntesis es una carpeta y false si el valor recibido entre
parntesis no es una carpeta.
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 9
Entonces si NO es una carpeta ( ! is_dir( ) ) hacemos el echo de la IMG.
$carpeta = opendir( 'imagenes' );
while( $archivo = readdir($carpeta ) ){
if( ! is_dir( $archivo ) ){
//salteamos TODAS las carpetas que encuentre.
echo '';
}
}
MANEJO DE ARCHIVOS
Para el manejo de archivos, este documento se limitar a mostrar una funcin bsica que
permite la lectura del contenido de un archivo o insertar en un archivo un determinado
contenido.
Son funciones ideales para la generacin de archivos de tipo TXT, HTML, SQL o XML (o
cualquier formato de texto plano, que no requiera un programa que los compile).
Para levantar el contenido de un archivo, simplemente se deber usar la funcin
file_get_contents( ) archivo_obtener_contenidos- que recibe entre parntesis un string con
el nombre de archivo a abrir.
$archivo = file_get_contents( 'datos.txt' );
//Guarda en $archivo todo el contenido de datos.txt
echo $archivo; //Muestra ese contenido en el HTML.
Por otra parte, para insertar contenido en un archivo tenemos dos opciones: La primera es, a
un archivo existente, agregarle contenido. La segunda es, a un archivo existente, reemplazarle
el contenido.
Para eso tenemos la funcin file_put_contents( ) archivo_insertar_contenidos- que recibe
dos o tres argumentos segn se desee agregar o reemplazar el contenido.
Los dos primeros argumentos son el nombre del archivo a escribir y todo el string a insertar.
El tercer argumento es optativo, y si recibe la constante FILE_APPEND (as como figura ac,
sin comillas y todo en maysculas) en vez de reemplazar el contenido del archivo, lo agregar
al final del ltimo caracter del archivo solicitado:
$contenido = 'Hola a todos'; //Una cadena de texto comn y corriente.
file_put_contents( 'archivo.txt', $contenido ); //Inserto y reemplazo.
$otro_contenido = 'Contenido nuevo'; //Otra cadena de texto
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 10
file_put_contents( 'archivo.txt', $otro_contenido ); //Se pierde lo
anterior
$agregar_contenido = 'Contenido nuevo'; //Otra cadena de texto
file_put_contents( 'archivo.txt', $agregar_contenido , FILE_APPEND);
//Agrega al final
En todos los ejemplos, cada vez que se hace uso de la funcin file_put_contents() y se
solicita un nombre de archivo que no existe, el mismo es creado en el momento, sin contenido.
Para borrar un archivo existente, simplemente se necesita la funcin unlink( ) que recibe como
nico argumento el nombre de archivo que se busca eliminar.
unlink( 'archivo.txt' ); // borra archivo.txt
Por ltimo, en TODOS los casos que se quiera leer el contenido de un archivo o borrar un
archivo del servidor, es necesario corroborar que el mismo existe, caso contrario PHP cortar
con un error de archivo no encontrado.
Eso se hace con una funcin que devolver true en caso de encontrar el archivo o false si el
mismo no existe en la ruta solicitada, file_exists( ); Solo en caso que exista podremos leer o
borrar el archivo en cuestin.
if( file_exists( 'archivo.txt' ) ){ //Solo si existe archivo.txt
unlink( 'archivo.txt' ); //Borra archivo.txt
}
if( file_exists( 'archivo.txt' ) ){ //Solo si existe archivo.txt
echo file_get_contents( 'archivo.txt' );
//Muestra el contenido de archivo.txt
}
SALTOS DE LINEA
Cabe destacar que tanto para mostrar en el documento HTML, como para guardar datos en un
archivo, los saltos de lnea son un tema para tener en cuenta.
Cuando creamos una cadena de texto (un string) que queremos guardar en un archivo, cada
vez que queremos generar un salto de lnea, deberemos usar la combinacin de los caracteres
\n que dentro del archivo, generarn un salto de lnea:
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 11
$contenido = "Hola\nMundo"; //La primer lnea tiene Hola la segunda
Mundo.
file_put_contents( 'archivo.txt' , $contenido ); //guarda en archivo.txt
Ahora, a la hora de mostrar el contenido de un archivo de texto plano en el HTML, todos esos
saltos de lnea ( \n ) para el HTML no significan nada (para hacer un salto de lnea, utiliza la
etiqueta ), por lo cual todos nuestros enters se mostrarn de corridos en el sitio web.
Para resolver esto, los contenidos que provengan de un file_get_contents() (o de cualquier
origen que pueda tener saltos de lnea \n) deberemos procesarlos por la funcin que convierte
los saltos de lnea en elementos . Ess funcin es nl2br() (New Line TO BR Nueva
lnea a br ).
$contenido = file_get_contents( 'archivo.txt'); //abro archivo.txt
echo nl2br( $contenido ); //muestro $contenido pasando los \n en .
CARGA DE ARCHIVOS
Subir un archivo desde el disco de un usuario a un sitio web (en el servidor) es una tarea que
solo puede realizarse mediante el uso de formularios, utilizando el control de tipo FILE.
Tal como sucede con todos los controles de formulario, el input de tipo FILE, debe tener
especificado un nombre mediante el uso del atributo NAME que ser la forma en que luego se
buscar desde PHP.
Cabe recordar que para poder utilizar los input de tipo FILE, el formulario deber tener el
atributo ENCTYPE con el valor seteado en multipart/form-data, que es la manera en que se
envan los archivos adjuntos por la red. De no tenerlo, el archivo no ser enviado.
$_FILES
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 12
As como PHP ofrece las colecciones predeterminadas $_GET y $_POST, que nos permite
acceder mediante el uso de corchetes (como un array asociativo) a los datos enviados por los
mtodos get y post, tambin ofrece el array de archivos $_FILES.
Este array, tendr un elemento por cada control de tipo FILE recibido de un formulario,
referenciado por el NAME que se le haya indicado. De tal manera si tenemos un formulario con
los siguientes dos archivos adjuntos:
Tendremos una posicin del $_FILES por cada archivo, y entre los corchetes los identificaremos
por el NAME de cada uno:
$archivo1 = $_FILES['archivo1']; //primer input
$archivo1 = $_FILES['otro_archivo']; //segundo input
El array $_FILES es multidimensional, lo cual significa que por cada uno de esos archivos,
podremos acceder las siguientes informaciones:
tmp_name: nombre de la carpeta y del archivo donde fue subido temporalmente al
servidor (generalmente se trata de una carpeta de sistema). Este valor lo genera
automticamente el servidor al recibir un control de tipo FILE, con este valor
recuperaremos el archivo subido.
name: nombre real del archivo recibido.
size: tamao en bytes del archivo recibido. Este dato es importante para hacer
restricciones basadas en el peso lmite aceptado.
type: mime-type del archivo recibido, ejemplo, un JPG mostrar image/jpeg.
error: booleano que mostrar 0/1 acorde a si se ha detectado un error en la recepcin
del archivo (por ejemplo, que se haya cortado la transferencia o haya llegado corrupto)
Esta lista de valores las podemos acceder ya sea desde las variables $archivo1 y $archivo2
por los $_FILES[archivo] y $_FILES[otro_archivo], como se muestra a continuacin:
//Guardo el archivo recibido en una variable
$archivo1 = $_FILES['archivo'];
//Muestra el nombre del archivo enviado
echo $archivo1['name'];
//Hace lo mismo que la lnea anterior
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 13
echo $_FILES['archivo']['name'];
As es como se ve todo el contenido del array $_FILES cuando se reciben los archivos foto.jpg y
cancin.mp3 (mostrado desde un print_r ).
Array
(
[archivo] => Array
(
[name] => foto.jpg
[type] => image/jpeg
[tmp_name] => C:\wamp\tmp\phpBE4.tmp
[error] => 0
[size] => 3660
)
[otro_archivo] => Array
(
[name] => cancion.mp3
[type] => audio/mp3
[tmp_name] => C:\wamp\tmp\phpBF5.tmp
[error] => 0
[size] => 2922916
)
)
CAPTURANDO LOS ARCHIVOS
Cuando un formulario enva un archivo al servidor, en primera instancia el mismo se almacena
temporalmente en una carpeta del sistema operativo y no del sitio web y con un nombre que
no es el real. Esa informacin se puede recuperar con el tmp_name del archivo recibido.
Para poder guardar el archivo recibido en la carpeta destino de nuestro sitio web, el documento
PHP que procesa el upload de los archivos deber moverlo de la carpeta temporal a la carpeta
destino mediante el uso de la funcin move_uploaded_file(); mover archivo subido. Esta funcin recibe slo dos valores entre los parntesis: carpeta y nombre del archivo original, carpeta y nombre del archivo destino.
//Guardo el archivo recibido en una variable
$file = $_FILES['archivo'];
//Carpeta y nombre temporal del archivo recibido
$origen = $file['tmp_name'];
//Carpeta y nombre del archivo subido
$destino='uploads/'.$file['name'];
//Mueve el archivo temporal al nuevo nombre.
move_uploaded_file( $origen , $destino );
-
CLIENTES WEB Strings y Manejo de archivos
Prof. Germn Rodrguez [email protected] 14
Si se guarda en una variable, la funcin move_uploaded_file() devuelve un booleano, que
dar false en caso de haber ocurrido un error en la carga permitiendo la depuracin de errores
o la notificacin del archivo cargado satisfactoriamente. //Guardo el archivo recibido en una variable
$file = $_FILES['archivo'];
//Carpeta y nombre temporal del archivo recibido
$origen = $file['tmp_name'];
//Carpeta y nombre del archivo subido
$destino='uploads/'.$file['name'];
//Mueve el archivo temporal al nuevo nombre y guarda la respuesta en una
variable.
$respuesta = move_uploaded_file( $origen , $destino );
if( $respuesta == true ){
echo 'Archivo subido ok';
}else{
echo 'Error en la carga';
}