2011-02-14 19 views
3

我遇到了用戶上傳文件名的麻煩,我必須處理。當我嘗試訪問它們時,因爲它們中的一些具有特殊字符,所用的命令表示該文件未找到或類似。PHP:轉義文件名爲linux的

我已經使用escapeshellcmd沒有成功。

當我在linux控制檯中使用「tab」鍵(當你開始輸入文件名並且你想要它完成時),bash會正確地轉義文件名,如果我恰好使用那個「轉義」文件名,有用。

我已經試過這樣:

preg_replace("/[^a-zA-Z0-9\-\.\s]/", "\\\\$0", $filename) 

逃跑除了數字,字母的一切 - 和空格...但我發現,對於文件「test_1.jpg」,這個命令將其轉換爲「TEST_1 .jpg「,並且它不起作用,因爲」_「不需要轉換。我敢問,如何在Linux控制檯bash中「克隆」「tab」鍵的轉義函數?

謝謝!

+0

爲什麼不重命名文件上傳? – 2011-02-14 15:52:43

+0

對不起,但我不能看到「test_1.jpg」和「test_1.jpg」之間的區別? – 2011-02-14 15:55:58

回答

2

我將它用於文件名和用於將博客文章標題等內容製作成URL。

// everything to lower and no spaces begin or end 
$path = strtolower(trim($path)); 

// adding - for spaces and union characters 
$find = array(' ', '&', '\r\n', '\n', '+',','); 
$path = str_replace ($find, '-', $path); 

//delete and replace rest of special chars 
$find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/'); 
$repl = array('', '-', ''); 
$path = preg_replace ($find, $repl, $path); 
+0

對不起,但我不能重命名文件,我需要相同的文件名,因爲用戶上傳 – FlamingMoe 2011-02-14 22:34:17

0

如果您在Web服務器上直接訪問這些文件,文件名需要URL用urlencode編碼,而不是escapeshellcmd