Come rimuovere l'estensione dalla stringa (solo estensione reale!)


135

Sto cercando una piccola funzione che mi permetta di rimuovere l'estensione da un nome file.

Ho trovato molti esempi cercando su Google, ma sono cattivi, perché rimuovono solo parte della stringa con "." . Usano il punto per limitatore e tagliano semplicemente la stringa.

Guarda questi script,

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

o

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

Quando aggiungiamo la stringa in questo modo:

Questo è un esempio di somestring

Restituirà solo "Questo" ...

L'estensione può contenere 3 o 4 caratteri, quindi dobbiamo verificare se il punto è in 4 o 5 posizioni, quindi rimuoverlo.

Come si può fare?


1
Che cos'è un'estensione "reale"? Vuoi rimuovere gli ultimi 4 caratteri o se sono preceduti da un punto?
Clyfe,

"Col. Shrapnel" - è progettato per gli utenti Windows. "clyfe" - sì, voglio rimuovere tutto dopo il punto, ma solo se è in 4 o 5 posizioni, ciò che rappresenterà ".jpeg" o ".mp3". Non lo rimuoverò. So che posso farlo manualmente usando str-pos e tagliare la stringa usando usando l'istruzione if (se 5 pos = punto quindi tagliare (rtrim) da 5 caratteri a destra, se 4 pos = punto quindi rtrim 4, altrimenti ritornano senza alcuna modifica. forse è la soluzione più veloce
marc

3
Che dire dei file .package? O .unità? Sembra un po 'arbitrario limitare un'estensione a 4 caratteri.
rdb,

Risposte:


172

Prova questo:

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

Quindi, questo corrisponde a un punto seguito da tre o quattro caratteri che non sono un punto o uno spazio. La regola "3 o 4" dovrebbe probabilmente essere rilassata, poiché ci sono molte estensioni di file che sono più o meno lunghe.


il problema è che ci sono anche persone che rinominano file come:20120720.something.somethingelse.jpg
Obmerk Kronen

3
Non penso che funzionerà con file con due caratteri come estensione
NaturalBornCamper il

1
ty! si prega di notare che è necessario utilizzare virgolette singole se non si esegue la sostituzione variabile, ad es."$var"
aelgoa,

beh, per usarlo con i file .py credo che devi aggiungere 2,3,4 invece di solo 3,4:> grazie!
VoghDev,

2
@voghDev per supportare le estensioni da 2 a 4 caratteri che dovresti aggiungere {2,4}invece{3,4}
Timo Huovinen,


81

Dal manuale, 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
?>

Non deve essere un percorso completo per funzionare correttamente. Analizzerà altrettanto felicemente file.jpgquanto /path/to/my/file.jpg.


Ho già controllato questo. Stesso errore di cui sopra. Prova ad accedere a "$ path_parts ['nomefile']" da T.sec - "xxx" 23 12 32 3 a twym2 Restituirà solo T. Dall'esempio sopra non dovrebbe rimuovere nulla!
marc

56

Usa PHP basename ()

(PHP 4, PHP 5)

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

Uscite: stringa (4) "test"


2
+1 Se i requisiti indicati per un'estensione non fossero rigidi, questa sarebbe la risposta perfetta.
Kayla,

1
Guardando i commit su php.net c'è l'idea di lavorare con un array ... che penso possa essere migliorato usando qualcosa come array-walk
CrandellWS,

35

Questa è una soluzione piuttosto semplice e funzionerà indipendentemente dalla lunghezza dell'estensione o dal numero di punti o altri caratteri nella stringa.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

Fondamentalmente questo cerca solo l'ultima occorrenza di. e quindi utilizza la sottostringa per recuperare tutti i caratteri fino a quel punto.

È simile a uno dei tuoi esempi su Google ma più semplice, più veloce e più facile delle espressioni regolari e degli altri esempi. Beh, comunque. Spero che aiuti qualcuno.


2
So che arriverà troppo tardi, ma penso che questa sia la risposta migliore. Funziona alla grande.
Agbogidi Michael,

questo non funzionerà per * nix file nascosti senza estensione, ad esempio,.htaccess
Fr0zenFyr

12

Puoi usare ciò che PHP ha integrato per aiutare ...

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

Tuttavia, se hai a che fare solo con un nome file ( .somefile.jpg), otterrai ...

./somefile

Guardalo su CodePad.org

O usa un regex ...

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

Guardalo su CodePad.org

Se non hai un percorso, ma solo un nome file, questo funzionerà e sarà molto più difficile ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Guardalo su CodePad.org

Naturalmente, entrambi cercano solo l'ultimo periodo ( .).


Come accennato nell'ultima riga della soluzione, fallirà per nomi di file come.htaccess
Fr0zenFyr

8

Il seguente codice funziona bene per me ed è piuttosto breve. Semplicemente suddivide il file in un array delimitato da punti, elimina l'ultimo elemento (che è ipoteticamente l'estensione) e riformula nuovamente l'array con i punti.

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);

restituirà false se il file non ha estensione o vuoto se il file è.htaccess
Timo Huovinen

5

Ho trovato molti esempi su Google ma ce ne sono di cattivi perché basta rimuovere parte della stringa con "."

In realtà questa è assolutamente la cosa giusta da fare. Vai avanti e usalo.

L'estensione del file è tutto dopo l'ultimo punto e non è necessario che un'estensione del file contenga un determinato numero di caratteri. Anche parlando solo di Windows, viene già fornito con estensioni di file che non si adattano a 3-4 caratteri, come ad esempio. .manifest.


2
..e non dimentichiamoci .htaccesse .htpasswdnegli ambienti apache.
h2ooooooo,

5

Raccomandare l'uso: pathinfo con PATHINFO_FILENAME

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

4

Ci sono alcuni modi per farlo, ma penso che uno dei modi più veloci sia il seguente

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

Un'altra soluzione è questa. Non l'ho testato, ma sembra che dovrebbe funzionare per più periodi in un nome file

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

Anche:

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

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

In tutti questi, $namecontiene il nome file senza l'estensione


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

Produzione:

this-is.file.name

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Aggiungilo per ottenere l'estensione del file.
I_ATE_YOUR_WORK_FILES

2

Come altri citano, l'idea di limitare l'estensione a un certo numero di caratteri non è valida. Partendo dall'idea di array_pop, pensando a una stringa delimitata come un array, questa funzione mi è stata utile ...

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;

Uscite:

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

In azione:

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


1

È possibile impostare la lunghezza del modello di espressione regolare utilizzando l' {x,y}operatore.{3,4}corrisponderebbe se il modello precedente si verifica 3 o 4 volte.

Ma non penso che ne abbia davvero bisogno. Cosa farai con un file chiamato "This.is"?


0

Usa questo:

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

Funziona solo se il nome file non ha già un punto. PHP Docs menziona la prima occorrenza di ago
ricaduta

0

Prova a usare questo. rimuoverà sicuramente l'estensione del file.

$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'

Potresti ridurlo a una riga con array_pop ()
Peter Brand,

0

EDIT : l'approccio più intelligente IMHO, rimuove l' ultimo punto e il seguente testo da un nome di file (aka l'estensione):

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

Saluti ;)


Mentre potrebbe funzionare, end()non dovrebbe funzionare con una funzione passata come parametro. Produce anche un avviso: solo le variabili devono essere passate per riferimento
CodeBrauer

0

Funziona quando ci sono più parti in un'estensione ed è sia breve che efficiente:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.