Como obter a extensão de arquivo em PHP: do iniciante ao profissional em 2025
\n\nVocê já parou para pensar quantas vezes por dia um desenvolvedor PHP precisa extrair a extensão de um arquivo? Dezenas, senão centenas. Upload de avatares, processamento de documentos, validação de imagens — em todos os casos é preciso identificar o tipo de arquivo: .jpg, .pdf ou o astuto .php.jpg.
A pergunta "How can I get a file's extension in PHP?" é uma das mais populares no Stack Overflow. E não é à toa. Parece simples, mas o diabo está nos detalhes. Em 2025, temos não apenas os clássicos pathinfo() e explode(), mas também novos recursos do PHP 8.4 que tornam o código mais limpo e seguro.
Vamos explorar 5 métodos funcionais, seus prós, contras e quando usar cada um. Vamos nessa!
\n\n1. O clássico: pathinfo() — o rei dos métodos
\n\nO método mais popular e correto é a função pathinfo(). Ela existe desde o PHP 4 e continua relevante. Por quê? Porque é inteligente: considera separadores de caminho do sistema, funciona com URLs e não quebra com pontos no nome do arquivo.
<?php\n$arquivo = 'documento.relatorio.pdf';\n$extensao = pathinfo($arquivo, PATHINFO_EXTENSION);\n// Resultado: 'pdf'\n?>\n\nMas há um detalhe. Se o arquivo não tiver extensão, pathinfo() retorna uma string vazia. Não null, nem false — apenas uma string vazia. Isso é importante para validações rigorosas.
<?php\n$arquivo = 'LEIAME';\n$ext = pathinfo($arquivo, PATHINFO_EXTENSION);\nvar_dump($ext); // string(0) ""\n?>\n\nQuando usar: sempre que precisar obter a extensão de forma rápida e confiável. É o padrão da indústria.
\n\n2. Método tradicional: explode() e strrpos()
\n\nAlguns desenvolvedores mais experientes preferem a manipulação manual de strings. A ideia é simples: encontrar o último ponto e pegar tudo depois dele.
\n\n<?php\n$arquivo = 'imagem.jpg';\n$partes = explode('.', $arquivo);\n$extensao = end($partes);\n// Resultado: 'jpg'\n?>\n\nParece funcionar. Mas tem um problema: explode() cria um array, e end() move o ponteiro interno do array. Não é crítico, mas não é elegante.
Uma versão mais eficiente usa strrpos() + substr():
<?php\n$arquivo = 'arquivo.tar.gz';\n$pos = strrpos($arquivo, '.');\n$extensao = $pos !== false ? substr($arquivo, $pos + 1) : '';\n// Resultado: 'gz'\n?>\n\nObserve: strrpos() busca a última ocorrência do ponto. Isso é correto — queremos gz, não tar.gz.
Quando usar: quando pathinfo() não estiver disponível (raro) ou quando precisar de mais controle sobre a lógica.
3. Novidade de 2025: str_contains() e str_starts_with()
\n\nNo PHP 8.0 surgiram str_contains() e str_starts_with(), e no PHP 8.4 houve melhorias no suporte a strings multibyte. Isso abre novas possibilidades elegantes.
<?php\n$arquivo = 'foto.2025.jpg';\n\nif (str_contains($arquivo, '.')) {\n $extensao = substr($arquivo, strrpos($arquivo, '.') + 1);\n} else {\n $extensao = '';\n}\n// Resultado: 'jpg'\n?>\n\nBonito? Nem tanto. Mas se você precisa verificar se o arquivo é uma imagem, str_ends_with() é seu aliado:
<?php\n$arquivo = 'avatar.png';\n$ehImagem = str_ends_with($arquivo, '.png') || str_ends_with($arquivo, '.jpg');\n// true\n?>\n\nQuando usar: para verificações rápidas de extensões específicas sem extrair a extensão completa.
\n\n4. Expressões regulares: quando você quer tudo de uma vez
\n\nÀs vezes, apenas a extensão não é suficiente. Por exemplo, você pode precisar verificar se o arquivo é uma imagem segura e, ao mesmo tempo, extrair o nome sem a extensão. É aí que entram as regex.