2013-07-09 3 views
0

Я в основном после метода извлечения имени файла из пути. Тип файла может измениться, и имя файла может иметь пробел. Также путь может быть в форме Unix или в форме Windows.PHP Extract File Name

/Users/Bob/Documents/some file.docx 

Или

C:\Users\Bob\My Documents\some file.docx 

Полный исходный путь уже хранится в переменной с именем $fileSource и у меня есть имя файла без расширения в переменной с именем $fileName. Я попытался использовать str_replace, чтобы заменить общую часть источника файла нулевым пространством, но путь может измениться, поэтому это небезопасно.

Я думал, что если regex можно использовать для работы назад через строку, последнее (чтение слева направо) \ или /, но я пока не знаю много regex. Я прочитал о возвратной функции, которая должна начинаться (? < = строка), но я не могу заставить это работать.

Последнее, что мне нужно имя файла с расширением, потому что я использую PHP, чтобы скопировать его из одного места в другое, и если у меня нет расширения файла, файлы появятся без расширения, и мне придется добавьте его вручную.

Cheers.

+2

Что случилось с встроенным [Pathinfo()] (http://php.net/manual/ en/function.pathinfo.php), для этой цели есть –

+0

+1 для ['pathinfo'] (http://php.net/manual/en/function.pathinfo.php). – Jon

+0

Проверьте руководство по PHP в [basename] (http://www.php.net/manual/en/function.basename.php) –

ответ

3

Это невероятно простой в использовании pathinfo:

$fileName = pathinfo($fileSource, PATHINFO_BASENAME); 

..or просто basename:

$fileName = basename($fileSource); 

Обратите внимание: пути Windows, не будут корректно работать на Линукс-серверов и Linux пути не будет правильно работать на серверах Windows (из-за того, что DIRECTORY_SEPERATOR отличается).

DEMO on a linux server

+0

@Jack Correct - добавлена ​​информация в ответ. – h2ooooooo

+0

@Jack Кроме расширения добавляется. Конечно, вы можете сделать 'basename ($ fileSource). '' , pathinfo ($ fileSource, PATHINFO_EXTENSION) ', но вы будете называть 2 функции вместо 1, и читаемость будет не проще (на мой взгляд), поэтому поэтому я использовал только один вызов' pathinfo' :) – h2ooooooo

+1

Хотя если вы используете <5.2, вам действительно нужно обновить .... даже если вы используете 5.2.x, вам действительно нужно обновить –

1

РНР pathinfo специально для этого:

Примеры:

$file = pathinfo($yourFile, PATHINFO_FILENAME); 

$file_ext = strtolower(pathinfo($yourFile, PATHINFO_EXTENSION)); //gets the file extension 
0

Попробуйте это (альтернатива Pathinfo):

<?php 
$filePath = '/Users/Bob/Documents/some file.docx'; // using *nix here 
$file  = end(explode(DIRECTORY_SEPARATOR, $filePath)); 

echo $file; 

В случае, если вы беспокоиться о путях без имени файла (так путь к каталогу), а затем использовать это:

<?php 
$filePath = '/Users/Bob/Documents/some file.docx'; // using *nix here 
$DS  = DIRECTORY_SEPARATOR; // this way you can handle WinOS and *NIX paths 
$file  = end(explode($DS, trim($filePath, $DS)); 

// Check if the path contains a dot, so it's a file name 
// with extension (e.g. filename.php) 
$file  = (strpos($file, '.') !== false) ? $file : false; 

echo $file;