Como remover a extensão da string (apenas extensão real!)

135

Estou procurando uma pequena função que permita remover a extensão de um nome de arquivo.

Encontrei muitos exemplos pesquisando no Google, mas eles são ruins, porque apenas removem parte da string com "." . Eles usam ponto como limitador e apenas cortam a corda.

Veja esses scripts,

$from = preg_replace('/\.[^.]+$/','',$from);

ou

 $from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));

Quando adicionamos a string assim:

Este é um exemplo de somestring

Ele retornará apenas "Este" ...

A extensão pode ter 3 ou 4 caracteres, portanto, precisamos verificar se o ponto está na posição 4 ou 5 e removê-lo.

Como pode ser feito?

marc
fonte
1
O que é uma extensão "real"? Deseja remover os últimos 4 ou caracteres, se forem precedidos por um ponto?
clyfe
"Coronel Shrapnel" - foi desenvolvido para usuários do Windows. "clyfe" - sim, eu quero remover tudo depois do ponto, mas somente se estiver na posição 4 ou 5, o que representará ".jpeg" ou ".mp3". Eu apenas não vou removê-lo. Eu sei que posso fazê-lo manualmente usando str-pos e cortar string usando using if statement (se 5 pos = ponto e depois cortar (rtrim) da direita 5 caracteres, se 4 pos = ponto e então rtrim 4, caso contrário, retorne sem nenhuma modificação. talvez seja uma solução mais rápida.
Marc
3
E os arquivos .package? Ou comunidade? Parece um pouco arbitrário restringir uma extensão a 4 caracteres.
rdb 16/09/16

Respostas:

172

Tente este:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);

Portanto, isso corresponde a um ponto seguido por três ou quatro caracteres que não são um ponto ou um espaço. A regra "3 ou 4" provavelmente deve ser relaxada, pois há várias extensões de arquivo mais curtas ou mais longas.

nickf
fonte
o problema é que também existem pessoas que renomeiam arquivos como:20120720.something.somethingelse.jpg
Obmerk Kronen
3
Eu não acho que isso vai funcionar com arquivos com dois personagens como uma extensão
NaturalBornCamper
1
ty! Por favor, note que você deve usar aspas simples se você não realizar variável de substituição por exemplo"$var"
aelgoa
bem, para usá-lo com arquivos .py eu acho que você deve adicionar 2,3,4 em vez de apenas 3,4:> obrigado!
voghDev
2
@voghDev para oferecer suporte a extensões com 2 a 4 caracteres que você deve adicionar em {2,4}vez de{3,4}
Timo Huovinen
81

No manual, pathinfo :

<?php
    $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"; // Since PHP 5.2.0
?>

Não precisa ser um caminho completo para funcionar corretamente. Analisará file.jpgtão alegremente quanto /path/to/my/file.jpg.

Erik
fonte
Eu já verifiquei isso. Mesmo erro que acima. Tente acessar "$ path_parts ['filename']" em T.sec - "xxx" 23 12 32 3 a twym2 Ele retornará apenas T. No exemplo acima, não deve remover nada!
marc
56

Usar nome de base do PHP ()

(PHP 4, PHP 5)

var_dump(basename('test.php', '.php'));

Saídas: string (4) "test"

Lamy
fonte
2
+1 Se os requisitos mencionados para uma extensão não fossem rigorosos, essa seria a resposta perfeita.
Kayla
1
Olhando para os commits em php.net há uma idéia sobre como trabalhar com uma variedade ... que eu acho que poderia ser melhorado usando algo como array de caminhada
CrandellWS
35

Essa é uma solução bastante fácil e funcionará, não importa quanto tempo a extensão ou quantos pontos ou outros caracteres estejam na sequência.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

Basicamente, isso apenas procura a última ocorrência de. e, em seguida, usa substring para recuperar todos os caracteres até esse ponto.

É semelhante a um de seus exemplos pesquisados ​​no Google, mas mais simples, mais rápido e mais fácil que as expressões regulares e os outros exemplos. Bem, de qualquer maneira. Espero que ajude alguém.

wprenison
fonte
2
Sei que isso está chegando tarde demais, mas acho que essa é a melhor resposta. Funciona bem.
Agbogidi Michael
isso não vai funcionar para arquivos * nix escondida sem extensão por exemplo,.htaccess
Fr0zenFyr
12

Você pode usar o que o PHP incorporou para ajudar ...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);

Embora se você estiver lidando apenas com um nome de arquivo ( .somefile.jpg), receberá ...

./somefile

Veja no CodePad.org

Ou use uma regex ...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);

Veja no CodePad.org

Se você não tiver um caminho, mas apenas um nome de arquivo, isso funcionará e será muito mais tenso ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Veja no CodePad.org

Obviamente, esses dois apenas procuram o último período ( .).

alex
fonte
Como mencionado na última linha de solução, ele falhará para nomes de arquivos como.htaccess
Fr0zenFyr
8

O código a seguir funciona bem para mim e é bastante curto. Ele apenas divide o arquivo em uma matriz delimitada por pontos, exclui o último elemento (que é hipoteticamente a extensão) e reforma a matriz com os pontos novamente.

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);
Emanegux
fonte
retornará false se o arquivo não tem extensão ou esvaziar se o arquivo for.htaccess
Timo Huovinen
5

Encontrei muitos exemplos no Google, mas existem maus porque basta remover parte da string com "."

Na verdade, isso é absolutamente a coisa correta a se fazer. Vá em frente e use isso.

A extensão do arquivo é tudo após o último ponto, e não é necessário que a extensão do arquivo tenha um número específico de caracteres. Mesmo falando apenas sobre o Windows, ele já vem com extensões de arquivo que não cabem de 3 a 4 caracteres, como por exemplo. .manifest.

bobince
fonte
2
..e não vamos esquecer .htaccesse .htpasswdem ambientes apache.
h2ooooooo
5

Recomende o uso: pathinfo com PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);
Alex
fonte
4

Existem algumas maneiras de fazer isso, mas acho que uma das maneiras mais rápidas é a seguinte

// $filename has the file name you have under the picture
$temp = explode( '.', $filename );
$ext = array_pop( $temp );
$name = implode( '.', $temp );

Outra solução é essa. Ainda não testei, mas parece que deve funcionar por vários períodos em um nome de arquivo

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

Além disso:

$info = pathinfo( $filename );
$name = $info['filename'];
$ext  = $info['extension'];

// Or in PHP 5.4, i believe this should work
$name = pathinfo( $filename )[ 'filename' ];

Em tudo isso, $namecontém o nome do arquivo sem a extensão

Ascherer
fonte
4
$image_name = "this-is.file.name.jpg";
$last_dot_index = strrpos($image_name, ".");
$without_extention = substr($image_name, 0, $last_dot_index);

Resultado:

this-is.file.name
Abhishek
fonte
1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Adicione isso para obter a extensão do arquivo.
I_ATE_YOUR_WORK_FILES
2

Como outros mencionam, a idéia de limitar a extensão a um certo número de caracteres é inválida. Seguindo a ideia de array_pop, pensando em uma string delimitada como uma matriz, essa função foi útil para mim ...

function string_pop($string, $delimiter){
    $a = explode($delimiter, $string);
    array_pop($a);
    return implode($delimiter, $a);
}

Uso:

$filename = "pic.of.my.house.jpeg";
$name = string_pop($filename, '.');
echo $name;

Saídas:

pic.of.my.house  (note it leaves valid, non-extension "." characters alone)

Em ação:

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0

jbobbins
fonte
1

Você pode definir o comprimento do padrão de expressão regular usando o {x,y}operador {3,4}corresponderia se o padrão precedente ocorrer 3 ou 4 vezes.

Mas acho que você realmente não precisa disso. O que você fará com um arquivo chamado "This.is"?

Seu senso comum
fonte
0

Usa isto:

strstr('filename.ext','.',true);
//result filename
Shintadoniku Alyssa
fonte
Isso funciona apenas se o nome do arquivo ainda não tiver um período. Os documentos do PHP mencionam a primeira ocorrência de agulha
relipse
0

Tente usar este. certamente removerá a extensão do arquivo.

$filename = "image.jpg";
$e = explode(".", $filename);
foreach($e as $key=>$d)
{
if($d!=end($e)
{

$new_d[]=$d; 
}

 }
 echo implode("-",$new_t);  // result would be just the 'image'
Gilbert Aldava
fonte
Você poderia reduzir isso a uma linha com array_pop ()
Peter Marca
0

EDIT : A abordagem mais inteligente IMHO, remove o último ponto e o texto a seguir de um nome de arquivo (também conhecido como extensão):

$name = basename($filename, '.' . end(explode('.', $filename)));

Felicidades ;)

andcl
fonte
Embora possa funcionar, end()não deve funcionar com uma função passada como parâmetro. Também produz um aviso: Apenas variáveis devem ser passados por referência
CodeBrauer
0

Isso funciona quando há várias partes em uma extensão e é curto e eficiente:

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