2012-02-12 166 views
0
$filename = 'mypic.gif'; 

// 1. The "explode/end" approach 
$ext = end(explode('.', $filename)); 

// 2. The "strrchr" approach 
$ext = substr(strrchr($filename, '.'), 1); 

// 3. The "strrpos" approach 
$ext = substr($filename, strrpos($filename, '.') + 1); 

// 4. The "preg_replace" approach 
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename); 

// 5. The "never use this" approach.  
    //   From: http://php.about.com/od/finishedphp1/qt/file_ext_PHP.htm 
$exts = split("[/\\.]", $filename); 
$n = count($exts)-1; 
$ext = $exts[$n]; 

我有麻煩進行第5步,任何人都能解釋嗎? 而且從不使用方法意味着什麼?從文件獲取擴展

+1

如果你的[上一個問題沿着類似的路線](http://stackoverflow.com/questions/9251707/removing-extensions-from-filename)被關閉爲一個確切的重複,也許你應該使用指定的重複問題的答案還是您上一個問題的高度優先的第一條評論? – rdlowrey 2012-02-12 19:20:22

+0

我有點不同意這是重複的。 OP在這裏要求解釋一個具體的實現,就像上面代碼中所說的那樣... – 2012-02-12 19:23:41

+0

我同意 - 我不認爲它是重複的。這是一個有效的問題,只是想知道爲什麼OP仍然搞亂它。我想撤銷(過於草率的)近距離投票,但我原來的意見仍然存在。 – rdlowrey 2012-02-12 19:25:08

回答

2

不使用這種方法的最明顯的原因是split() function is deprecated in PHP 5.3,並且將在以後的版本中被刪除。它不應該使用,因爲該功能將消失。

此外,如果文件名沒有擴展名,當您嘗試從$exts[$n]訪問擴展名時,您會收到Undefined index通知,因爲未設置$exts[-1]。發生這種情況的原因是文件名中沒有.,但$exts數組爲空(count($exts) === 0),但代碼沒有考慮到這種可能性。

+0

+1詳盡解釋。 – rdlowrey 2012-02-12 19:26:51

0

所有這些方法,你就錯過了內置功能:

$filename = 'mypic.gif'; 
$extension = pathinfo($filename,PATHINFO_EXTENSION); 
var_dump($extension); 

這並不直接回答你關於方法號#5的問題...但你爲什麼要與所有搞亂這些方法並忽略了PHP明確規定爲您做這些事情?