2010-02-02 39 views
132

ho questo codice PHP:PHP, ottenere il nome del file senza estensione di file

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 ho un file chiamato my.zip, questa funzione restituisce .zip.

voglio fare il contrario, voglio che la funzione restituisca my senza l'estensione.

Il file è solo una stringa in una variabile.

+0

arresto regexing. – Pacerier

+0

Risposta migliore: ** http: //stackoverflow.com/questions/8123998/file-name-without-extension** –

risposta

239

Non c'è bisogno di tutto questo. Dai un'occhiata a pathinfo(), ti dà tutti i componenti del tuo percorso.

Esempio dal manuale:

$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 

output del codice:

/www/htdocs 
index.html 
html 
index 

E in alternativa, si può ottenere solo alcune parti come:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html 
+2

Perché è stato downvoted? La risposta è assolutamente corretta. pathinfo funziona su stringhe, quindi non importa se il file è effettivamente sul server o meno. – Gordon

+2

@Pekka Ho aggiunto un esempio per l'utilizzo delle opzioni. Spero non ti dispiaccia. Questa dovrebbe essere la risposta accettata. – Gordon

+0

@Gordon Cheers! E modificare via, va benissimo. –

174

In alternativa al pathinfo() , puoi usare

  • basename() - Restituisce il nome del file del percorso

Esempio da PHP manuale

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

Devi conoscere l'estensione di rimuoverlo in anticipo però.

Tuttavia, dal momento che la tua domanda suggerisce avete la necessità di ottenere l'estensione e il nome base, avrei votato Pekka's answer come il più utile, perché vi darà tutte le informazioni che ci si vuole circa il percorso e file con una sola funzione nativa.

+0

grazie mille –

+0

funziona alla grande! grazie mille! – Kakitori

+0

cosa succede se non so sull'estensione del file .. diciamo se il percorso è dinamico, qualsiasi estensione di file può venire in esso !! allora cosa ?? – user889030

8

@Gordon nome base funzionerà bene se si conosce l'estensione, se non è possibile utilizzare esplodere:

$filename = end(explode(".", $file)); 
+1

Si prega di inviare commenti a me con la funzione di commento sotto la mia risposta. La funzione più appropriata per questo è 'pathinfo', motivo per cui ho dato' basename' solo come alternativa. Non è necessario reinventare 'pathinfo' con espressioni regolari o' explode'. – Gordon

+29

non funzionerà se il file è simile a my.file.2.1.zip –

+3

@fire, l'aggiornamento non ha senso. 'end (esplode (". ", $ file));' fornisce l'estensione, non il nome del file. – Pacerier

4

@fire incassa il nome del file utilizza i puntini, si potrebbe ottenere l'uscita sbagliata. vorrei utilizzare il metodo @Gordon ma ottenere l'estensione anche, in modo la funzione basename funziona con tutte le estensioni, in questo modo:

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

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

altro approccio è usando le espressioni regolari.

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

Questo rimuove dal dell'ultimo periodo . fino alla fine della stringa.

+0

Mi piace questa risposta, molto semplice e funziona quando non si conosce l'estensione. – relipse

+0

Molto meglio dell'utilizzo di esplode e cattura solo la sezione dell'ultimo periodo nel caso in cui si utilizzassero periodi nei nomi di file – Kiwizoom

+5

** No **, è molto peggio. Smetti di regexare le persone. – Pacerier

1
nome

file senza estensione del file quando non si sa che l'estensione:

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

+2

Che ne dici se l'estensione è qualcosa come .tar.gz? – Arda

0

Questo ritorno solo nome del file senza alcuna estensione in 1 fila:

$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" 
9

Se l'estensione non è noto, utilizzare questa soluzione

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" 

PHP MAN function pathinfo

+0

Si prega di fornire un like alla pagina man php per 'pathinfo'. Questo aiuterà OP a migliorare il metodo 'ShowFileExtension' e fornirà una lettura extra per chiunque cerchi di trovare questa risposta. Anche un po 'di descrizione non andrebbe fuori strada ... –

+1

Ho già risposto a questa domanda con la stessa soluzione, ~ 2 anni prima del tuo;) – yckart

+0

@yckart true ma questo fornisce più esempi all'interno della risposta. Il tuo ha il vantaggio di collegarsi a ideone.com ma il sito potrebbe andare offline. –

1

Se non si sa quale estensione si ha, allora si può provare questo:

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

Lavorare con tutte le possibilità:

image.jpg // output: "image" 
filename.image.png // output: "filename.image" 
index.php // output: "index" 
4

nel mio caso, io uso qui di seguito. Non mi interessa quale sia la sua estensione. : D penso che vi aiuterà a

$exploded_filepath = explode(".", $filepath_or_URL); 
$extension = end($exploded_filepath); 
echo basename($filepath_or_URL, ".".$extension); //will print out the the name without extension. 
+0

Btw .: Hai un errore di battitura in '$ extenion' –

1

È possibile scrivere questo

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

Questi tornerà elemento corrente della matrice, se non utilizzati in precedenza.

+0

Ciao, Pleas e controlla prima di effettuare il downgrade. Funzionava che l'avevo usato nel mio codice molte volte. Usando questa funzione è possibile ottenere solo un nome di file se il nome del file è "xyz.jpg". Potrebbe non funzionare con i nomi di file che contengono l'intero percorso in esso. –

2

Breve

echo pathinfo(__FILE__)['filename']; // since php 5.2 
+0

buono. Ma se metto sopra il codice in 'b.php' e ho eseguito' a.php' avendo 'require ('b.php')'. Quindi l'output mostrerà come 'b' invece di' a' –

1

La tua risposta è sotto la soluzione perfetta per nascondere al file di estensione in php.

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

Quasi tutta la soluzione di cui sopra hanno il nome del file ottenere mostrata dalla variabile $ PATH

seguito frammento sarà ottenere il nome del file eseguito corrente senza estensione

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

Spiegazione

$ _SERVER ['SCRIPT_NAME'] contiene il percorso dello script corrente.

0

Non è necessario scrivere molto codice. Anche può essere fatto solo da una riga di codice. Vedi here

Di seguito è riportato il codice di una riga che restituisce solo il nome del file e rimuove nome dell'estensione:

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

Si stamperà

logo 

Fonte: Remove extension and return only file name in PHP

Problemi correlati