2013-07-09 79 views
0

我基本上是從路徑中提取文件名的方法。文件類型可能會更改,文件名可能會有空白。此外,路徑可能是Unix格式或Windows格式。PHP Extract文件名

/Users/Bob/Documents/some file.docx 

或者

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

完整的源路徑已經被存儲在一個名爲$fileSource變量,我有文件名沒有在一個名爲$fileName變量的擴展。我試圖用str_replace來替換零空間的文件源的公共部分,但路徑可能會改變,所以這是不可行的。

我想如果正則表達式可以被用來反向通過字符串最後(從左到右讀)\或/但我真的不知道很多正則表達式呢。我已閱讀應該開始的向後看的功能(?< = 字符串),但我無法得到這個工作。

最後我需要擴展名的文件名的原因是因爲我使用PHP將它從一個位置複製到另一個位置,如果我沒有文件擴展名的文件沒有擴展名,我必須手動添加它。

如果我問的是不可能的,我想我可以使用正則表達式來獲取文件擴展名,然後將其連接到$fileName,但我希望有更優雅的東西。

乾杯。

+2

內建[pathinfo()](http://php.net/manual/ en/function.pathinfo.php)函數,對於['pathinfo'](http://php.net/manual/en/function.pathinfo.php),它實際上就是用於此目的 –

+0

+1。 – Jon

+0

在[basename](http://www.php.net/manual/en/function.basename.php)檢查PHP手冊 –

回答

3

它使用簡單的不可思議pathinfo

$fileName = pathinfo($fileSource, PATHINFO_BASENAME); 

..或者乾脆basename

$fileName = basename($fileSource); 

請注意:將Windows路徑將無法正常Linux服務器上工作和Linux的路徑不會在Windows服務器上正常工作(由於DIRECTORY_SEPERATOR不同)。

DEMO on a linux server

+0

@Jack正確 - 爲答案添加了信息。 – h2ooooooo

+0

@Jack除了添加擴展名。當然你可以做'basename($ fileSource)。 '' 。 pathinfo($ fileSource,PATHINFO_EXTENSION)''但你會調用2個函數而不是1,並且可讀性不會更容易(在我看來),所以爲什麼我只用一次調用'pathinfo' :) – h2ooooooo

+1

雖然如果你使用<5.2,你應該升級....即使你使用5.2.x,你也應該升級 –

1

PHP的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;