Cómo obtener la extensión de un archivo en PHP: de principiante a experto en 2025
\n\n¿Alguna vez te has preguntado cuántas veces al día un desarrollador PHP necesita extraer la extensión de un archivo? Decenas, si no cientos. Subida de avatares, procesamiento de documentos, validación de imágenes... en todas partes necesitas saber qué tipo de archivo tienes entre manos: .jpg, .pdf o el astuto .php.jpg.
La pregunta "How can I get a file's extension in PHP?" es una de las más populares en Stack Overflow. Y con razón. Parece algo sencillo, pero el diablo está en los detalles. En 2025 no solo contamos con los clásicos pathinfo() y explode(), sino también con las nuevas capacidades de PHP 8.4 que hacen el código más limpio y seguro.
Vamos a analizar 5 métodos funcionales, sus ventajas, desventajas y cuándo usar cada uno. ¡Allá vamos!
\n\n1. El clásico indiscutible: pathinfo() — el rey de todos los métodos
\n\nLa forma más popular y correcta es la función pathinfo(). Apareció en PHP 4 y sigue siendo igual de relevante. ¿Por qué? Porque es inteligente: tiene en cuenta los separadores de ruta del sistema, funciona con URL y no se rompe con puntos en el nombre del archivo.
<?php\n$file = 'documento.reporte.pdf';\n$extension = pathinfo($file, PATHINFO_EXTENSION);\n// Resultado: 'pdf'\n?>\n\nPero hay un detalle. Si el archivo no tiene extensión, pathinfo() devuelve una cadena vacía. No null, ni false, sino una cadena vacía. Esto es importante para validaciones estrictas.
<?php\n$file = 'README';\n$ext = pathinfo($file, PATHINFO_EXTENSION);\nvar_dump($ext); // string(0) ""\n?>\n\nCuándo usarlo: siempre que necesites obtener la extensión de forma rápida y fiable. Es el estándar de la industria.
\n\n2. El método de la vieja escuela: explode() y strrpos()
\n\nAlgunos desarrolladores más veteranos prefieren el análisis manual de cadenas. La idea es simple: encontrar el último punto y tomar todo lo que está después.
\n\n<?php\n$file = 'imagen.jpg';\n$parts = explode('.', $file);\n$extension = end($parts);\n// Resultado: 'jpg'\n?>\n\nParece que funciona. Pero hay una trampa: explode() crea un array, y end() mueve el puntero interno del array. No es crítico, pero no es elegante.
Una variante más eficiente es strrpos() + substr():
<?php\n$file = 'archivo.tar.gz';\n$pos = strrpos($file, '.');\n$extension = $pos !== false ? substr($file, $pos + 1) : '';\n// Resultado: 'gz'\n?>\n\nObserva que strrpos() busca la última aparición del punto. Esto es correcto: queremos gz, no tar.gz.
Cuándo usarlo: cuando pathinfo() no esté disponible (algo exótico) o necesites más control sobre la lógica.
3. Novedad 2025: str_contains() y str_starts_with()
\n\nEn PHP 8.0 aparecieron str_contains() y str_starts_with(), y en PHP 8.4 se mejoró el manejo de cadenas multibyte. Esto abre nuevas formas elegantes de trabajar.
<?php\n$file = 'foto.2025.jpg';\n\nif (str_contains($file, '.')) {\n $extension = substr($file, strrpos($file, '.') + 1);\n} else {\n $extension = '';\n}\n// Resultado: 'jpg'\n?>\n\n¿Bonito? No mucho. Pero si necesitas verificar si un archivo es una imagen, str_ends_with() es tu aliado:
<?php\n$file = 'avatar.png';\n$isImage = str_ends_with($file, '.png') || str_ends_with($file, '.jpg');\n// true\n?>\n\nCuándo usarlo: para comprobaciones rápidas de extensiones específicas sin extraer la extensión completa.
\n\n4. Expresiones regulares: cuando lo quieres todo y ya
\n\nA veces una sola extensión no es suficiente. Por ejemplo, necesitas verificar que el archivo sea una imagen segura y, de paso, extraer el nombre sin extensión. Aquí es donde entran las expresiones regulares.