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?


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.


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.


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"


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.


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 ( .).


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);

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.


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);

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


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

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


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"?


0

Usa isto:

strstr('filename.ext','.',true);
//result filename

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'

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 ;)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.