Pergunta

Esta é uma pergunta que você pode ler em toda parte na 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, há sempre "a melhor maneira" e que deveria estar no Stack Overflow.

Foi útil?

Solução

Pessoas de outras linguagens de script sempre pensar deles é melhor, porque eles têm um built-in função de fazer isso e não PHP (Estou olhando para Pythonistas agora: -)).

Na verdade, ele existe, mas poucas pessoas sabem disso. Conheça pathinfo() :

$ext = pathinfo($filename, PATHINFO_EXTENSION);

Este é rápido e built-in. pathinfo() pode dar-lhe outras informações, tais como caminho canônico, dependendo da constante que você passar para ele.

Lembre-se que se você quer ser capaz de lidar com caracteres não ASCII, você precisa definir a localidade em primeiro lugar. Por exemplo:

setlocale(LC_ALL,'en_US.UTF-8');

Além disso, note que este não leva em consideração o conteúdo do arquivo ou mime-type, você só tem a extensão. Mas é o que você pediu.

Por último, nota que este só funciona para um caminho de arquivo, não um caminho recursos de URL, que é coberto usando parse_url.

Aproveite

Outras dicas

pathinfo()

$path_info = pathinfo('/foo/bar/baz.bill');

echo $path_info['extension']; // "bill"

exemplo URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

Para URLs, não use PATHINFO :

$x = pathinfo($url);
$x['dirname']   🡺 'http://example.com/myfolder'
$x['basename']  🡺 'sympony.mp3?a=1&b=2#XYZ'         // <------- BAD !!
$x['extension'] 🡺 'mp3?a=1&b=2#XYZ'                 // <------- BAD !!
$x['filename']  🡺 'sympony'

Use parse_url em vez disso:

$x = parse_url($url);
$x['scheme']  🡺 'http'
$x['host']    🡺 'example.com'
$x['path']    🡺 '/myfolder/sympony.mp3'
$x['query']   🡺 'aa=1&bb=2'
$x['fragment']🡺 'XYZ'             

Nota:. Hashtags não estão disponíveis no lado do servidor, somente se forem adicionados manualmente


Para todos os exemplos de PHP nativos, consulte: obter o URL completo em PHP

Há também SplFileInfo :

$file = new SplFileInfo($path);
$ext  = $file->getExtension();

Muitas vezes, você pode escrever um código melhor se você passar como um objeto ao redor em vez de uma string, o código está mais falando então. Desde o PHP 5.4 este é um one-liner:

$ext  = (new SplFileInfo($path))->getExtension();

resposta E-satis é a maneira correta para determinar a extensão do arquivo.

Como alternativa, em vez de confiar em uma extensão de arquivos, você poderia usar o fileinfo ( http: //us2.php. net / fileinfo ) para determinar os arquivos MIME tipo.

Aqui está um exemplo simplificado de processamento de uma imagem enviada por um usuário:

// Code assumes necessary extensions are installed and a successful file upload has already occurred

// Create a FileInfo object
$finfo = new FileInfo(null, '/path/to/magic/file');

// Determine the MIME type of the uploaded file
switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) {        
    case 'image/jpg':
        $im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
    break;

    case 'image/png':
        $im = imagecreatefrompng($_FILES['image']['tmp_name']);
    break;

    case 'image/gif':
        $im = imagecreatefromgif($_FILES['image']['tmp_name']);
    break;
}

1) Se você estiver usando (PHP 5> = 5.3.6) você pode usar SplFileInfo :: GetExtension - Obtém a extensão de arquivo

código Exemplo

<?php

$info = new SplFileInfo('test.png');
var_dump($info->getExtension());

$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());

?>

Esta saída vontade

string(3) "png"
string(2) "gz"

2) Outra maneira de obter a extensão se você estiver usando (PHP 4> = 4.0.3, PHP 5) é pathinfo

código Exemplo

<?php

$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);

$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);

?>

Esta saída vontade

string(3) "png"
string(2) "gz"

// EDIT: removido um suporte

Enquanto ele não contém caminho que você também pode usar:

array_pop(explode('.',$fname))

Onde $fname é um nome do arquivo, por exemplo: my_picture.jpg E o resultado seria: jpg

Às vezes é útil para não usar pathinfo($path, PATHINFO_EXTENSION), por exemplo:

$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz

Observe também que pathinfo não consegue lidar com alguns caracteres não-ASCII (geralmente apenas suprime-los a partir da saída), em extensões que geralmente não é um problema, mas não faz mal estar ciente de que ressalva.

A maneira mais simples de obter extensão de arquivo em PHP é usar php construído em função pathinfo .

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // the out should be extension of file eg:-png, gif, html
substr($path, strrpos($path, '.') + 1);

Uma solução rápida seria algo como isto.

    //exploding the file based on . operator
    $file_ext = explode('.',$filename);

    //count taken (if more than one . exist; files like abc.fff.2013.pdf
    $file_ext_count=count($file_ext);

    //minus 1 to make the offset correct
    $cnt=$file_ext_count-1;

    // the variable will have a value pdf as per the sample file name mentioned above.

$file_extension= $file_ext[$cnt];

Aqui está um exemplo, suponha que $ filename é "example.txt"

$ext = substr($filename,strrpos($filename,'.',-1),strlen($filename));  

Assim $ ext será ".txt"

pathinfo é matriz. Podemos verificar nome do diretório, nome do arquivo, extensão etc

$path_parts = pathinfo('test.png');

echo $path_parts['extension'], "\n";
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['filename'], "\n";  

Você pode tentar também esta
(Trabalho em php 5. * e 7)

$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip

Dica: devolver uma cadeia vazia se o arquivo não tem extensão
apreciá-lo;)

Este trabalho irá

$ext = pathinfo($filename, PATHINFO_EXTENSION);

Eu achei que o pathinfo() e soluções SplFileInfo funciona bem para arquivos padrão no sistema de arquivos local, mas você pode encontrar dificuldades se você estiver trabalhando com arquivos remotos como URLs para imagens válidas pode ter um # (identificadores de fragmentos) e / ou ? (parâmetros de consulta) no final da URL, que ambas as soluções vai (incorreta) tratar como parte da extensão do arquivo.

Eu encontrei esta era uma maneira confiável para uso pathinfo() em uma URL após a primeira análise lo para retirar a desordem desnecessária após a extensão do arquivo:

$url_components = parse_url($url); // First parse the URL
$url_path = $url_components['path']; // Then get the path component
$ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()

Você pode tentar também o seguinte:

 pathinfo(basename( $_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION)

Por que não usar substr($path, strrpos($path,'.')+1);? É o método mais rápido de todos comparar. @Kurt Zhong já respondeu.

Vamos verificar o resultado comparativo aqui: https://eval.in/661574

Você pode obter todas extensão de arquivo em particular, pasta e fazer a operação com arquivo específico extensão

<?php
    $files=glob("abc/*.*");//abc is folder all files inside folder
    //print_r($files);
    //echo count($files);
    for($i=0;$i<count($files);$i++):
        $extension = pathinfo($files[$i], PATHINFO_EXTENSION);
        $ext[]=$extension;
        //do operation for perticular extenstion type
        if($extension=='html'){
            //do operation
        }
    endfor;
    print_r($ext);
?>

Se você está à procura de velocidade (como em um roteador), você provavelmente não quer tokenizar tudo. Muitas outras respostas irá falhar com /root/my.folder/my.css

ltrim(strrchr($PATH, '.'),'.');

Embora o "melhor maneira" é discutível, creio que esta é a melhor maneira por alguns motivos:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. Ele funciona com várias partes para uma extensão, por exemplo tar.gz
  2. Curto e código eficiente
  3. Ele funciona tanto com um nome de arquivo e um caminho completo

Na verdade, eu estava procurando por isso.

<?php

$url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';
$tmp = @parse_url($url)['path'];
$ext = pathinfo($tmp, PATHINFO_EXTENSION);

var_dump($ext);

IMO Esta é a melhor maneira se você tem nomes como name.name.name.ext (feio, mas às vezes acontece)

$ext     = explode( '.', $filename ); //explode the string
$ext_len = count( $ext ) - 1; //count the array -1 (becouse count() starts from 1)
$my_ext  = $ext[ $ext_len ]; //get the last entry of the array

echo $my_ext;

Use

str_replace('.', '', strrchr($file_name, '.'))

para uma recuperação rápida extensão (se você sabe com certeza o nome do arquivo tem um).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top