Melhor forma de se obter extensão de arquivo em PHP

Em algum momento na sua vida de programador você terá que obter/encontrar/separar/isolar a extensão de um certo arquivo (não estou me referindo ao mime-type dos arquivos neste post). Existe pelo menos 3 formas práticas de solucionar este caso.

A primeira, e talvez a mais utilizada, é com a função substr(), que pega os caracteres de um texto a partir da posição das letras (valor negativo, conta de trás para frente). A aplicação se faz desta forma:

$arquivo = 'nome.txt';
echo substr($arquivo, -3);
//escreve 'txt'

O problema de utilizar este modo é que quando a extensão do arquivo for de mais de três caracteres, a extensão fica cortada:

$arquivo = 'nome.mpeg';
echo substr($arquivo, -3);
//escreve 'peg'

A adaptação para este problema ficaria assim:

$arquivo = 'nome.mpeg';
$arquivo = substr($arquivo, -4);
if($arquivo[0] == '.'){
     $arquivo = substr($arquivo, -3);
}
echo $arquivo;
//escreve 'mpeg'

Porém, ainda assim, se existir uma extensão com mais de quatro ou menos de 3 caracteres, esta solução não funciona.

A segunda forma é utilizando a função strrchr() que retorna o que vem depois de um caractere estipulado, ficando:

$arquivo = 'nome.mpeg';
echo strrchr($arquivo, '.');
// escreve '.mpeg'

Se o objetivo é trazer a extensão juntamente com o ponto, esta é a melhor forma. Porém, se não é este o objetivo, deve-se contar então com o auxílio da função str_replace():

$arquivo = 'nome.mpeg';
echo str_replace('.','',strrchr($arquivo, '.'));
// escreve 'mpeg'

Outra forma de se adquirir a extensão de um arquivo. É através da função explode() para separar o nome do ponto e a função end() para encontrar a última posição do array formado, que no caso é o que vem depois da vírgula:

$arquivo = 'nome.mpeg';
echo end(explode(".", $arquivo));
//escreve 'mpeg'

Tanto a segunda quanto a terceira solução funcionam muito bem e podem ser usadas junto com a função strtolower() que transforma o nome inteiro do arquivo para letras minúsculas, ideal para urls:

$arquivo = 'Nome.MPEG';
echo strtolower(end(explode(".", $arquivo)));
//escreve 'mpeg'

E finalmente, a minha forma preferida seria obter de forma direta a extensão usando a função pathinfo() que retorna informações sobre o arquivo, e para obter a extensão, só precisamos fornecer a constante PATHINFO_EXTENSION para o segundo parâmetro da função.

$arquivo = pathinfo('/home/host/Nome.mpeg', PATHINFO_EXTENSION);
// escreve 'mpeg'

Até a próxima, abraços!

Facebook Twitter Linkedin Digg Delicious Reddit Stumbleupon Tumblr Posterous