PHP, obtenha o nome do arquivo sem extensão

205

Eu tenho este código PHP:

function ShowFileExtension($filepath)
{
    preg_match('/[^?]*/', $filepath, $matches);
    $string = $matches[0];

    $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);

    if(count($pattern) > 1)
    {
        $filenamepart = $pattern[count($pattern)-1][0];
        preg_match('/[^?]*/', $filenamepart, $matches);
        return strtolower($matches[0]);
    }
}

Se eu tiver um arquivo nomeado my.zip, essa função retornará .zip.

Quero fazer o inverso, quero que a função retorne my sem a extensão.

O arquivo é apenas uma string em uma variável.

Mostafa Elkady
fonte

Respostas:

398

Não há necessidade de tudo isso. Confira pathinfo () , ele fornece todos os componentes do seu caminho.

Exemplo do manual:

$path_parts = pathinfo('/www/htdocs/index.html');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // filename is only since PHP 5.2.0

Saída do código:

/www/htdocs
index.html
html
index

Como alternativa, você pode obter apenas certas partes, como:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html
Czechnology
fonte
3
Por que isso foi prejudicado? A resposta está absolutamente correta. pathinfo opera em strings, portanto, não importa se o arquivo está realmente no servidor ou não.
Gordon
13
É lamentável que eles tenham nomeado erroneamente "basename", pois retorna o nome do arquivo completo com extensão, não o nome da base.
Oscar
1
@ Oscar é o significado mais amplamente entendido do termo basename. Sem erros de designação.
Nawfal #
1
Isso é muito útil, especialmente quando você não precisa conhecer a extensão do arquivo para extraí-la.
Vahid Amiri 02/02
Esta é uma solução extremamente elegante. Parabéns. Isso deve ser marcado como a resposta correta.
Native Coder
199

Como alternativa pathinfo(), você pode usar

  • basename() - Retorna o componente do caminho do nome do arquivo

Exemplo do manual do PHP

$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"

Você precisa conhecer a extensão para removê-la com antecedência.

No entanto, como sua pergunta sugere que você precisa obter a extensão e o nome da base, eu votaria a resposta de Pekka como a mais útil, porque fornecerá as informações desejadas sobre o caminho e o arquivo com um único arquivo nativo função.

Gordon
fonte
1
e se eu não souber sobre a extensão do arquivo .. digamos que se o caminho for dinâmico, qualquer tipo de extensão de arquivo pode aparecer! então o que ??
user889030
@ user889030, você tem um cenário diferente do OP e não o usa basename, mas, pathinfocomo mostrado mais, estava na página.
Gordon
72

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);

Teste funcional simples: https://ideone.com/POhIDC

yckart
fonte
Isto iria retornar o nome do arquivo com extensão
user966939
2
@ user966939 Mhh, não com extensão é basename;-)
yckart
Bem, de qualquer maneira, ele estava pedindo uma solução SEM extensão. ;)
user966939
2
@ user966939, Cara, não há extensão alguma. É PATHINFO_FILENAME, não PATHINFO_EXTENSION ....
Pacerier
20
Quem decidiu que filenamenão tem uma extensão enquanto basenamefaz deve ter algumas tendências sádicas ...
Mark
12

Outra abordagem é usar expressões regulares.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

Isso remove do último período .até o final da string.

caiosm1005
fonte
Eu gosto desta resposta, muito simples e funciona quando você não conhece a extensão.
relipse
Muito melhor do que usar explodir, e só pega a última seção período em caso de ter usado períodos em nomes de arquivos
Kiwizoom
7
Não , é muito, muito pior. Pare de regexar pessoas.
Pacerier
Obrigado, e os comentários acima acertaram em cheio. Não precisar conhecer a extensão torna isso mais útil.
James Taylor
1
@ caiosm1005, a superfície de ataque aumenta imediatamente porque é difícil argumentar contra as partes internas de um mecanismo de expressão regular. Por exemplo, no código acima, não seria estranho se houvesse alguma entrada $fileNameque pudesse fazer com que o mecanismo funcionasse em tempo exponencial (ou pior). E supondo que tenhamos terminado de dissecar as partes internas desse mecanismo regex específico e provado que ele é robusto contra todos os valores possíveis $fileName, o código ainda não é arbitrariamente portátil para outra plataforma que possui outra implementação do mecanismo regex.
Pacerier
12

Se a extensão não for conhecida, use esta solução

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"

 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"

Função PHP MAN pathinfo

anydasa
fonte
Por favor, forneça um like na página de manual do php pathinfo. Isso ajudará o OP a melhorar o ShowFileExtensionmétodo e fornecerá uma leitura extra para quem tentar encontrar essa resposta. Também um pouco de uma descrição não desviar ...
Michael Coxon
1
Eu respondi a esta pergunta já com a mesma solução, ~ 2 anos antes de vocês;)
yckart
@yckart true, mas isso fornece vários exemplos dentro da resposta. O seu site tem o benefício de criar um link para ideone.com, mas o site pode ficar offline.
Adam Elsodaney
7

@Gordon basename funcionará bem se você souber a extensão, se não souber, poderá usar o explodir:

$filename = end(explode(".", $file));
fogo
fonte
1
Por favor, envie comentários para mim com a função de comentário abaixo da minha resposta. A função mais apropriada para isso é pathinfo, e é por isso que dei apenas basenamecomo alternativa. Não há necessidade de reinventar pathinfocom regex ou explode.
Gordon
4
@fire, sua atualização não faz sentido. end(explode(".", $file));fornece a extensão, não o nome do arquivo.
Pacerier 5/03
7

Quase todas as soluções acima têm o nome de arquivo mostrado na variável $ path

O snippet abaixo obterá o nome do arquivo executado atualmente sem extensão

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

Explicação

$ _SERVER ['SCRIPT_NAME'] contém o caminho do script atual.

Rohan Khude
fonte
7

Não há necessidade de escrever muito código. Mesmo isso pode ser feito apenas por uma linha de código. Veja aqui

Abaixo está o código de uma linha que retorna apenas o nome do arquivo e remove o nome da extensão:

<?php
 echo pathinfo('logo.png')['filename'];
?>

Irá imprimir

logo

Fonte: Remova a extensão e retorne apenas o nome do arquivo no PHP

Faruque Ahamed Mollick
fonte
4

@fire, caso o nome do arquivo use pontos, você pode obter a saída errada. Eu usaria o método @Gordon, mas também obteria a extensão, portanto a função basename funciona com todas as extensões, desta forma:

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"
NSINE
fonte
4

no meu caso, eu uso abaixo. Eu não ligo para qual é sua extensão. : D eu acho que vai te ajudar

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.
Hoàng Vũ Tgtt
fonte
Btw .: Você tem um erro de digitação em$extenion
Thomas Kekeisen 15/02
2

Você pode escrever isso

$filename = current(explode(".", $file));

Eles retornarão o elemento atual da matriz, se não for usado antes.

Jitendra Pawar
fonte
Olá, Fundamentos e verifique antes de desclassificá-lo. Está funcionando, eu o usei no meu código várias vezes. Ao usar esta função, você pode obter apenas um nome de arquivo Se o nome do arquivo for "xyz.jpg". Pode não funcionar com nomes de arquivos contendo o caminho inteiro.
Jitendra Pawar #
Isso também não funciona corretamente se um nome de arquivo tiver vários pontos, por exemplo, "some.interesting.image.jpg"
ganzpopp
2

Curto

echo pathinfo(__FILE__)['filename']; // since php 5.2
mariovials
fonte
Boa. Mas se eu colocar o código acima b.phpe eu executei a.phptendo require('b.php'). Em seguida, a saída será como em bvez dea
Rohan Khude
1

Nome de arquivo sem extensão de arquivo quando você não a conhece:

$basename = substr($filename, 0, strrpos($filename, "."));

user2047861
fonte
2
Que tal se a extensão é algo como .tar.gz?
Arda
1

Se você não souber qual extensão possui, tente o seguinte:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

Trabalhando com todas as possibilidades:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"
Ghanshyam Gohel
fonte
1

Sua resposta está abaixo da solução perfeita para ocultar a extensão de arquivo em php.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>
shaz3e
fonte
1

As soluções existentes falham quando há várias partes em uma extensão. A função abaixo funciona para várias partes, um caminho completo ou apenas um nome de arquivo:

function removeExt($path)
{
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file
Dan Bray
fonte
0

Isso retorna apenas o nome do arquivo sem nenhuma extensão em 1 linha:

$path = "/etc/sudoers.php";    
print array_shift(explode(".", basename($path)));
// will print "sudoers"

$file = "file_name.php";    
print array_shift(explode(".", basename($file)));
// will print "file_name"
Vincenzo Ruffa
fonte