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.