PHP, ottieni il nome del file senza estensione


205

Ho questo codice 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 ho un file chiamato my.zip, questa funzione ritorna .zip.

Voglio fare il contrario, voglio che la funzione ritorni mysenza l'estensione.

Il file è solo una stringa in una variabile.


Risposte:


398

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

Uscita del codice:

/www/htdocs
index.html
html
index

E in alternativa puoi ottenere solo alcune parti come:

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

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

13
È un peccato che abbiano erroneamente chiamato "basename", poiché restituisce il nome file completo con estensione, non il nome base.
Oscar

1
@Oscar è il significato più compreso del termine basename. Nessun errore.
nawfal,

1
Questo è molto utile, specialmente quando non è necessario conoscere l'estensione del file per estrarlo.
Vahid Amiri,

Questa è una soluzione estremamente elegante. Complimenti. Questo dovrebbe essere contrassegnato come la risposta corretta.
Native Coder

199

In alternativa pathinfo(), puoi usare

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

Esempio dal manuale di 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"

Tuttavia, devi conoscere l'estensione per rimuoverla in anticipo.

Tuttavia, poiché la tua domanda suggerisce che hai la necessità di ottenere l'estensione e il nome di base, voterei la risposta di Pekka come la più utile, perché ti darà tutte le informazioni che desideri sul percorso e sul file con un singolo nativo funzione.


1
cosa succede se non conosco l'estensione del file .. diciamo che se il percorso è dinamico, qualsiasi tipo di estensione del file può entrare !! allora cosa ??
user889030,

@ user889030 hai uno scenario diverso dall'OP e non lo usi basename, ma pathinfocome mostrato altrove erano sulla pagina.
Gordon,

72

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

pathinfo($path, PATHINFO_FILENAME);

Test funzionale semplice: https://ideone.com/POhIDC


Ciò restituirebbe il nome file con estensione
user966939

2
@ user966939 Mhh, no con estensione è basename;-)
yckart

Beh, in entrambi i casi, stava chiedendo una soluzione SENZA estensione. ;)
user966939

2
@ user966939, amico non c'è alcuna estensione. E ' PATHINFO_FILENAME, non PATHINFO_EXTENSION ....
Pacerier

20
Chiunque abbia deciso che filenamenon ha un'estensione mentre basenamedeve avere alcune tendenze sadiche ...
Segna il

12

Un altro approccio consiste nell'utilizzare espressioni regolari.

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

Questo rimuove dall'ultimo periodo .fino alla fine della stringa.


Mi piace questa risposta, molto semplice e funziona quando non conosci l'estensione.
ricaduta

Molto meglio dell'uso
dell'esplosione

7
No , è molto peggio. Smetti di ripetere le persone.
Pacerier

Grazie, e i commenti di cui sopra l'hanno inchiodato. Non dover conoscere l'estensione rende questo più utile.
James Taylor,

1
@ caiosm1005, La superficie di attacco aumenta immediatamente perché è difficile ragionare contro gli interni di un motore regex. Ad esempio, nel codice sopra, non sarebbe strano se ci fosse qualche input $fileNameche potrebbe far funzionare il motore in tempo esponenziale (o peggio). E supponendo che abbiamo finito di dissezionare gli interni di questo specifico motore regex e teoricamente abbiamo dimostrato che è robusto contro ogni possibile valore $fileName, il codice non è ancora arbitrariamente portabile su un'altra piattaforma che ha un'altra implementazione del motore regex.
Pacerier,

12

Se l'estensione non è nota, 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"

Pathinfo della funzione MAN di PHP


Si prega di fornire un like alla pagina man di php per pathinfo. Questo aiuterà OP a migliorare il ShowFileExtensionmetodo e fornirà ulteriori letture a chiunque cerchi di trovare questa risposta. Anche un po 'di descrizione non andrebbe fuori strada ...
Michael Coxon,

1
Ho già risposto a questa domanda con la stessa soluzione, ~ 2 anni prima della tua;)
yckart

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

7

@Gordon basename funzionerà bene se conosci l'estensione, se non puoi usare esplodi:

$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 basenamesolo in alternativa. Non è necessario reinventare pathinfocon regex o explode.
Gordon,

4
@fire, il tuo aggiornamento non ha senso. end(explode(".", $file));ti dà l'estensione, non il nome del file.
Pacerier

7

Quasi tutte le soluzioni sopra hanno il nome del file mostrato mostrato dalla variabile $ path

Sotto lo snippet verrà visualizzato il nome del file attualmente eseguito senza estensione

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

Spiegazione

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



4

@fire se il nome file usa punti, potresti ottenere un output errato. Vorrei usare il metodo @Gordon ma ottenere anche l'estensione, quindi 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"

4

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

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

A proposito: Hai un errore di battitura$extenion
Thomas Kekeisen,

2

Puoi scrivere questo

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

Questi restituiranno l'elemento corrente dell'array, se non utilizzato in precedenza.


Ciao, per favore controlla prima di declassarlo. Funziona, l'ho usato molte volte nel mio codice. Utilizzando questa funzione è possibile ottenere solo un nome file Se il nome file è "xyz.jpg". Potrebbe non funzionare con nomi di file contenenti l'intero percorso al suo interno.
Jitendra Pawar,

Anche questo non funziona correttamente se un nome file contiene più punti, ad esempio "some.interesting.image.jpg"
ganzpopp

2

Corto

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

bene. Ma se ho inserito il codice sopra b.phpe l'ho eseguito a.phpavendo require('b.php'). Quindi l'uscita sarà come binvece dia
Rohan Khude il

1

Nome del file senza estensione quando non si conosce tale estensione:

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


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

1

Se non sai quale estensione hai, puoi 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"

1

La tua risposta è sotto la soluzione perfetta per nascondere l'estensione del file in php.

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

1

Le soluzioni esistenti falliscono quando ci sono più parti in un'estensione. La seguente funzione funziona per più parti, un percorso completo o solo un nome file:

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

0

Questo restituisce solo il nome file senza alcuna estensione in 1 riga:

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