PHP: Array, nombre y extensión

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.

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.