PHP:linux的转义文件名

时间:2011-02-14 15:47:04

标签: php escaping filenames

我遇到了我必须处理的用户上传文件名的麻烦。当我尝试访问它们时,因为它们中的一些具有特殊字符,所使用的命令表示找不到文件或类似文件。

我使用了没有成功的escapeshellcmd。

当我在linux控制台中使用“tab”键时(当你开始输入文件名并希望它完成时),bash正确地转义文件名,如果我使用了那个“转义”的文件名,那么的工作原理。

我试过这个:

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

除了数字,字母, - 和空格之外的所有内容......但我发现对于文件“test_1.jpg”,此命令会将其转换为“test_1.jpg”,但它不起作用,因为“_”不需要转换。

我担心会有更多“允许”字符,所以我的问题是......我怎样才能“克隆”linux控制台bash中“tab”键的转义功能?

谢谢!

4 个答案:

答案 0 :(得分:3)

如果要将文件名用作shell命令参数,可以使用函数escapeshellarg

答案 1 :(得分:2)

我将它用于文件名和用博客文章标题等制作网址。

// 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);

答案 2 :(得分:0)

如果您直接在网络服务器上访问这些文件,您的文件名需要使用urlencode进行网址编码,而不是使用escapeshellcmd进行编码

答案 3 :(得分:0)

这是我整合的功能,希望对您有帮助

您都可以添加|另一个逃脱的角色

public function linuxFilename($file)
{
    //make the linux filename perfect
    return preg_replace("/ |'|\(|\)/", '\\\${0}', $file);
}