Archive for the ‘file’ Tag

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 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'

E finalmente, a minha forma preferida 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'

Na maioria dos sistemas não Windows (como as distribuições Linux), os arquivos não necessitam possuir necessariamente uma extensão formal com ponto. Neste caso o único meio de se obter o tipo do arquivo é através de seu mime-type, que será visto em um post futuro.

Até a próxima questão, abraços!

Anúncios