Comment puis-je obtenir un nom de fichier à partir d'un chemin d'accès complet avec PHP?

229

Par exemple, comment obtenir Output.map

de

F:\Program Files\SSH Communications Security\SSH Secure Shell\Output.map

avec PHP?

OMG
la source

Réponses:

452

Vous cherchez basename.

L'exemple du manuel PHP:

<?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"
?>
Mark Rushakoff
la source
29
basename () a un bug lors du traitement des caractères asiatiques comme le chinois.
Sun Junwen
1
Merci Sun, vous venez de m'économiser des heures de suppression de bugs puisque mon application sera utilisée à l'étranger.
SilentSteel
11
Je suggérerais pathinfoplus basenameque Metafaniel a posté ci-dessous. pathinfo()vous donnera un tableau avec les parties du chemin. Ou pour le cas ici, vous pouvez simplement demander spécifiquement le nom du fichier. Donc, pathinfo('/var/www/html/index.php', PATHINFO_FILENAME)devrait retourner la 'index.php' documentation PHP Pathinfo
OnethingSimple
7
@OnethingSimple Vérifiez à nouveau les documents ... si intuitif que ce soit, vous voudrez PATHINFO_BASENAMEen avoir plein index.php. PATHINFO_FILENAMEvous donnera index.
levigroker
1
dans tous les cas, pour une méthode compatible unicode, mb_substr($filepath,mb_strrpos($filepath,'/',0,'UTF-16LE'),NULL,'UTF-16LE')- remplacez simplement UTF-16LE par le jeu de caractères utilisé par votre système de fichiers (NTFS et ExFAT utilise UTF16)
hanshenrik
68

Je l'ai fait en utilisant la fonction PATHINFOqui crée un tableau avec les parties du chemin à utiliser! Par exemple, vous pouvez faire ceci:

<?php
    $xmlFile = pathinfo('/usr/admin/config/test.xml');

    function filePathParts($arg1) {
        echo $arg1['dirname'], "\n";
        echo $arg1['basename'], "\n";
        echo $arg1['extension'], "\n";
        echo $arg1['filename'], "\n";
    }

    filePathParts($xmlFile);
?>

Cela reviendra:

/usr/admin/config
test.xml
xml
test

L'utilisation de cette fonction est disponible depuis PHP 5.2.0!

Ensuite, vous pouvez manipuler toutes les pièces selon vos besoins. Par exemple, pour utiliser le chemin complet, vous pouvez procéder comme suit:

$fullPath = $xmlFile['dirname'] . '/' . $xmlFile['basename'];
Metafaniel
la source
1
Cela m'a aidé, bonne réponse.
Wiki Babu
13

Il existe plusieurs façons d'obtenir le nom et l'extension du fichier. Vous pouvez utiliser le suivant qui est facile à utiliser.

$url = 'http://www.nepaltraveldoor.com/images/trekking/nepal/annapurna-region/Annapurna-region-trekking.jpg';
$file = file_get_contents($url); // To get file
$name = basename($url); // To get file name
$ext = pathinfo($url, PATHINFO_EXTENSION); // To get extension
$name2 =pathinfo($url, PATHINFO_FILENAME); // File name without extension
Khadka Pushpendra
la source
@peter Mortensen Merci pour votre soutien
Khadka Pushpendra
12

La basenamefonction devrait vous donner ce que vous voulez:

Étant donné une chaîne contenant un chemin d'accès à un fichier, cette fonction retournera le nom de base du fichier.

Par exemple, en citant la page du manuel:

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

Ou, dans votre cas:

$full = 'F:\Program Files\SSH Communications Security\SSH Secure Shell\Output.map';
var_dump(basename($full));

Tu auras:

string(10) "Output.map"
Pascal MARTIN
la source
10

Avec SplFileInfo :

SplFileInfo La classe SplFileInfo offre une interface orientée objet de haut niveau vers les informations d'un fichier individuel.

Réf : http://php.net/manual/en/splfileinfo.getfilename.php

$info = new SplFileInfo('/path/to/foo.txt');
var_dump($info->getFilename());

o / p: string (7) "foo.txt"

internes
la source
9

Essaye ça:

echo basename($_SERVER["SCRIPT_FILENAME"], '.php') 
atwebceo
la source
8

basename () a un bug lors du traitement des caractères asiatiques comme le chinois.

J'utilise ceci:

function get_basename($filename)
{
    return preg_replace('/^.+[\\\\\\/]/', '', $filename);
}
Sun Junwen
la source
Je ne pense pas que ce bogue, dans les docs son mentionnée: Caution basename() is locale aware, so for it to see the correct basename with multibyte character paths, the matching locale must be set using the setlocale() function. . Mais je préfère également utiliser preg_replace, car le séparateur de répertoires diffère selon les systèmes d'exploitation. Sur Ubuntu `\` n'est pas un séparateur direct et le nom de base n'aura aucun effet dessus.
Adam
7
$filename = basename($path);
p4bl0
la source
4

Pour ce faire, en quelques lignes, je suggère d'utiliser la DIRECTORY_SEPARATORconstante intégrée avec explode(delimiter, string)pour séparer le chemin en parties, puis arracher simplement le dernier élément du tableau fourni.

Exemple:

$path = 'F:\Program Files\SSH Communications Security\SSH SecureShell\Output.map'

//Get filename from path
$pathArr = explode(DIRECTORY_SEPARATOR, $path);
$filename = end($pathArr);

echo $filename;
>> 'Output.map'
Douglas Tober
la source
4

Vous pouvez utiliser la fonction basename () .

vertige
la source
1

Pour obtenir le nom de fichier exact de l'URI, j'utiliserais cette méthode:

<?php
    $file1 =basename("http://localhost/eFEIS/agency_application_form.php?formid=1&task=edit") ;

    //basename($_SERVER['REQUEST_URI']); // Or use this to get the URI dynamically.

    echo $basename = substr($file1, 0, strpos($file1, '?'));
?>
chandoo
la source
0
<?php

  $windows = "F:\Program Files\SSH Communications Security\SSH Secure Shell\Output.map";

  /* str_replace(find, replace, string, count) */
  $unix    = str_replace("\\", "/", $windows);

  print_r(pathinfo($unix, PATHINFO_BASENAME));

?> 

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/Rfxd0P"></iframe>

antelove
la source
0

C'est simple. Par exemple:

<?php
    function filePath($filePath)
    {
        $fileParts = pathinfo($filePath);

        if (!isset($fileParts['filename']))
        {
            $fileParts['filename'] = substr($fileParts['basename'], 0, strrpos($fileParts['basename'], '.'));
        }
        return $fileParts;
    }

    $filePath = filePath('/www/htdocs/index.html');
    print_r($filePath);
?>

La sortie sera:

Array
(
    [dirname] => /www/htdocs
    [basename] => index.html
    [extension] => html
    [filename] => index
)
Kathir
la source
0
$image_path = "F:\Program Files\SSH Communications Security\SSH Secure Shell\Output.map";
$arr = explode('\\',$image_path);
$name = end($arr);
Chandni Soni
la source
Veuillez décrire ce que vous avez changé et pourquoi, pour aider les autres à identifier le problème et à comprendre cette réponse
FZ