Esta é uma pergunta que você pode ler em qualquer lugar da Web com várias respostas:
$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);
$exts = split("[/\\.]", $filename);
$n = count($exts)-1;
$ext = $exts[$n];
etc.
No entanto, sempre existe "o melhor caminho" e deve estar no Stack Overflow.
php
file-extension
e-satis
fonte
fonte
strrchr($filename, '.');
Respostas:
Pessoas de outras linguagens de script sempre acham que a deles é melhor porque elas têm uma função interna para fazer isso e não o PHP (estou vendo os Pythonistas agora :-)).
De fato, existe, mas poucas pessoas sabem disso. Conheça
pathinfo()
:Isso é rápido e embutido.
pathinfo()
pode fornecer outras informações, como caminho canônico, dependendo da constante que você passar para ele.Lembre-se de que, se você quiser lidar com caracteres não ASCII, precisará primeiro definir o código do idioma. POR EXEMPLO:
Além disso, observe que isso não leva em consideração o conteúdo do arquivo ou o tipo MIME, você só obtém a extensão. Mas é o que você pediu.
Por fim, observe que isso funciona apenas para um caminho de arquivo, não um caminho de recursos de URL, coberto usando PARSE_URL.
Aproveitar
fonte
function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); }
verifique se o arquivo possui uma extensão; ele pode fazer qualquer coisa quando você passa um caminho como argumento!pathinfo()
fonte
echo pathinfo('/foo/bar/baz.bill')['extension'];
URL de exemplo:
http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
A) Não use sugestões inseguras
PATHINFO
:B) Use PARSE_URL :
BÔNUS: Veja todos os exemplos nativos do PHP
fonte
foo_folder/foo-file.jpg?1345838509
irá falhar miseravelmente com apenaspathinfo
, thanxparse_url
é para URL epathinfo
é para o caminho do arquivo.Há também
SplFileInfo
:Freqüentemente, você pode escrever um código melhor se passar um objeto assim ao invés de uma string. Seu código está mais falando então. Desde o PHP 5.4, este é um recurso:
fonte
->getExtension()
está disponível no SplFileInfo desde o PHP 5.3.6.A resposta do E-satis é a maneira correta de determinar a extensão do arquivo.
Como alternativa, em vez de depender de uma extensão de arquivos, você pode usar o fileinfo para determinar o tipo de MIME dos arquivos.
Aqui está um exemplo simplificado de processamento de uma imagem carregada por um usuário:
fonte
Contanto que ele não contenha um caminho, você também pode usar:
Onde
$fname
é um nome do arquivo, por exemplo:my_picture.jpg
. E o resultado seria:jpg
fonte
1) Se você estiver usando (PHP 5> = 5.3.6), poderá usar SplFileInfo :: getExtension - Obtém a extensão do arquivo
Código de exemplo
Isso produzirá
2) Outra maneira de obter a extensão se você estiver usando (PHP 4> = 4.0.3, PHP 5) é pathinfo
Código de exemplo
Isso produzirá
// EDIT: removeu um colchete
fonte
Às vezes é útil não usar
pathinfo($path, PATHINFO_EXTENSION)
. Por exemplo:Observe também que
pathinfo
falha ao manipular alguns caracteres não-ASCII (geralmente apenas os suprime da saída). Em extensões que geralmente não são um problema, mas não faz mal estar ciente dessa advertência.fonte
test.19-02-2014.jpeg
ltrim(strrchr($PATH, '.'),'.')
funciona como pathinfo, mas sem tokenizar tudo.A maneira mais simples de obter extensão de arquivo no PHP é usar a função interna pathinfo do PHP .
fonte
Você pode tentar também isso (funciona no PHP 5. * e 7):
Dica: retorna uma string vazia se o arquivo não tiver uma extensão
fonte
Desculpe ... "Pergunta curta; mas NÃO resposta curta"
Exemplo 1 para PATH
Exemplo 2 para URL
Saída do exemplo 1:
Saída do exemplo 2:
Referências
https://www.php.net/manual/en/function.pathinfo.php
https://www.php.net/manual/en/function.realpath.php
https://www.php.net/manual/en/function.parse-url.php
fonte
Uma solução rápida seria algo assim.
fonte
$file_ext = end(explode('.', $filename));
fazer tudo nesta resposta em uma única linha, em vez de quatro..tar.gz
. Isso não funcionará; portanto, se você precisar usar extensões, use-as comoltrim(strstr($filename, '.'), '.');
incorretamentegz
.Aqui está um exemplo. Suponha que $ filename seja "example.txt",
Então $ ext será ".txt".
fonte
pathinfo é uma matriz. Podemos verificar o nome do diretório, nome do arquivo, extensão , etc .:
fonte
fonte
Você também pode tentar isso:
fonte
fonte
Isso vai funcionar
fonte
Descobri que as soluções
pathinfo()
eSplFileInfo
funcionam bem para arquivos padrão no sistema de arquivos local, mas você pode ter dificuldades se estiver trabalhando com arquivos remotos, pois os URLs para imagens válidas podem ter um#
(identificador de fragmento) e / ou?
(parâmetros de consulta) no final do URL, que ambas as soluções (incorretas) tratam como parte da extensão do arquivo.Eu achei que essa era uma maneira confiável de usar
pathinfo()
um URL depois de analisá-lo para remover a confusão desnecessária após a extensão do arquivo:fonte
Use
substr($path, strrpos($path,'.')+1);
. É o método mais rápido de todas as comparações.@ Kurt Zhong já respondeu.
Vamos verificar o resultado comparativo aqui: https://eval.in/661574
fonte
Você pode obter todas as extensões de arquivo em uma pasta específica e executar operações com uma extensão de arquivo específica:
fonte
Faça mais rápido.
As chamadas de baixo nível precisam ser muito rápidas, então pensei que valia a pena pesquisar. Eu tentei alguns métodos (com vários comprimentos de string, comprimentos de extensão, várias execuções cada), eis alguns razoáveis:
Os resultados não foram muito surpreendentes. Pobre
pathinfo
é (de longe!) O mais lento (parece que ele está tentando analisar a coisa toda e depois largar todas as partes desnecessárias) - emethod3()
(strrpos) é o mais rápido, de longe:NOTA: o primeiro método tem um efeito colateral: retorna o nome inteiro quando não há extensão. Certamente não faria sentido medi-lo com outras strops para evitar esse comportamento.
Conclusão
Parece o Caminho do Samurai:
fonte
Se você está procurando velocidade (como em um roteador), provavelmente não deseja tokenizar tudo. Muitas outras respostas falharão com
/root/my.folder/my.css
fonte
Embora o "melhor caminho" seja discutível, acredito que seja o melhor por alguns motivos:
tar.gz
fonte
IMO, esta é a melhor maneira se você tiver nomes de arquivos como name.name.name.ext (feio, mas às vezes acontece):
fonte
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $fileName);
preg_replace, estamos usando a pesquisa de expressão regular e substituí-la. Na função preg_replace, o primeiro parâmetro é padrão para a pesquisa, o segundo parâmetro $ 1 é uma referência ao que for correspondido pelo primeiro (. *) E o terceiro parâmetro é o nome do arquivo.
Outra maneira, também podemos usar strrpos para encontrar a posição da última ocorrência de um '.' em um nome de arquivo e aumente essa posição em 1 para que ela exploda a string de (.)
$ext = substr($fileName, strrpos($fileName, '.') + 1);
fonte
Na verdade, eu estava procurando por isso.
fonte
Usar
para uma recuperação rápida da extensão (se você souber com certeza o nome do seu arquivo).
fonte