PHP: Array, nombre y extensión - Userlinux.net

Siempre hay una típica función que se reutiliza para cantidad de proyectos y se puede mejorar notablemente. En este caso se trata de separar nombre y extensión de un fichero. Nada del otro mundo pero podemos llegar a hacer verdaderas locuras para ello: En el caso más simple casi cualquier…

PHP: Array, nombre y extensión

r0sk 12.Sep.2008 1 Comentarios 1273 Lecturas
Siempre hay una típica función que se reutiliza para cantidad de proyectos y se puede mejorar notablemente. En este caso se trata de separar nombre y extensión de un fichero. Nada del otro mundo pero podemos llegar a hacer verdaderas locuras para ello:

En el caso más simple casi cualquier cosa valdría:
$file="nombre.jpg";
$extension = array_pop(explode('.',$file)); // Sacaría "jpg"
$nombre = array_shift(explode('.',$file));  // Sacaría "nombre"


Pero las disertaciones fueron un poco más allá. Suponiendo otro nombre de archivo un poco más tocapelotas -nombre.apellido.jpg- ya no valdría dicha funcionalidad. Y ahí empezó el dilema.

Una solución válida -aunque no del todo, ahora veremos el motivo- podría ser esta que propuso Mamel.
$a = array(
 'a' => substr($file, 0, strlen($file)-4),
 'e' => substr($file, 0, -3),
)
Enseguida nos dimos cuenta de que una suposición podría tirar al traste con el array: ¿y si la extensión tiene más de 3 caracteres?. El jpeg existe, entre muchas otras.

También Nacho (próximamente enlace a su blog) aportó su granito de arena:
$a = array (
 'a' => substr($file, 0, strpos('.',$file)),
 'e' => substr($file, strpos('.',$file)+1, strlen($file)),
)
Pero nos seguía pareciendo demasiado complicado para el cometido. Tenía que haber algo más sencillo en PHP.

Y así llegamos a la refinitiva (solo a partir de php 5.2 saca filename, antes de ésta versión solo informa de la ruta y extensión):
$file2 = pathinfo($file);
Array
(
    [dirname] => .
    [basename] => nombre.apellido.jpg
    [extension] => jpg
    [filename] => nombre.apellido
)
Y en caso de no tener php 5.2 siempre podemos partir de la extensión para sacar el resto de información que nos falta:
$file3 = basename($file, '.'.$file2['extension']);
Múltiples formas de solucionar un pequeño entuerto en PHP. Todas correctas y unas más acertadas que otras.
Categorías: programación
Tags: php array

Comentarios


gravatar
16.Sep.2008
Ahi va mi versión, una más no hará daño :)

Comentarios en aquí

function filedata($path) {
// Vaciamos la caché de lectura de disco
clearstatcache();
// Comprobamos si el fichero existe
$data["exists"] = is_file($path);
// Comprobamos si el fichero es escribible
$data["writable"] = is_writable($path);
// Leemos los permisos del fichero
$data["chmod"] = ($data["exists"] ? substr(sprintf("%o", fileperms($path)), -4) : FALSE);
// Extraemos la extensión, un sólo paso
$data["ext"] = substr(strrchr($path, "."),1);
// Primer paso de lectura de ruta
$data["path"] = array_shift(explode(".".$data["ext"],$path));
// Primer paso de lectura de nombre
$data["name"] = array_pop(explode("/",$data["path"]));
// Ajustamos nombre a FALSE si está vacio
$data["name"] = ($data["name"] ? $data["name"] : FALSE);
// Ajustamos la ruta a FALSE si está vacia
$data["path"] = ($data["exists"] ? ($data["name"] ? realpath(array_shift(explode($data["name"],$data["path"]))) : realpath(array_shift(explode($data["ext"],$data["path"])))) : ($data["name"] ? array_shift(explode($data["name"],$data["path"])) : ($data["ext"] ? array_shift(explode($data["ext"],$data["path"])) : rtrim($data["path"],"/")))) ;
// Ajustamos el nombre a FALSE si está vacio o a su valor en caso contrario
$data["filename"] = (($data["name"] OR $data["ext"]) ? $data["name"].($data["ext"] ? "." : "").$data["ext"] : FALSE);
// Devolvemos los resultados
return $data;
}

Escribe un comentario

Nick
Email
URL

Buscar

Cargando...

Categorías

Últimos comentarios

  • BartlettLilly20
  • r0sk
  • coder
  • argordmel
  • uveic
  • MarcosBL
  • quemada
  • alexander
  • Hakky111
  • tramel
  • hoyadas
  • hoyadas
  • hoyadas
  • Anubys
  • Arturo

Tagcloud

lugo freebsd seguridad futbol iphone mysql champions userlinux alemania_2006 copa bsd cakephp rfilms deportes meme blogs conciertos bake debian macosx apple humor programación música games 2008 beers tip lucux cake sysadmin ssh ibook films cumpleaños bash league barça soccer mundial frases opinion felicidades hack php juegos cms personal 2007 ubuntu ds mac sidenotes openbsd linux blogsfera rsidenotes blog nintendo san_froilan

Archivo

Social

Twitter

Enlaces

Enlaces de interés