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

12.Sep.2008 ~ 1 Comentarios ~ 1761 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;
}

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece
  • r0sk
  • flexo
  • r0sk
  • MarcosBL
  • r0sk
  • isra

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

bake ubuntu blogsfera ps3 barça programación conciertos freebsd twitt mundial macosx frases lugo nintendo deportes futbol software iphone vacaciones blog ds league canción opinion juegos cake seguridad champions games linux hack 2008 mac alemania_2006 web bash cumpleaños lucux mysql humor bsd userlinux sysadmin cakephp ssh openbsd 2007 django films personal rfilms apple felicidades blogs debian meme php rsidenotes twitter sidenotes

Archivo

Social

Enlaces de interés