我遇到了我必须处理的用户上传文件名的麻烦。当我尝试访问它们时,因为它们中的一些具有特殊字符,所使用的命令表示找不到文件或类似文件。
我使用了没有成功的escapeshellcmd。
当我在linux控制台中使用“tab”键时(当你开始输入文件名并希望它完成时),bash正确地转义文件名,如果我使用了那个“转义”的文件名,那么的工作原理。
我试过这个:
preg_replace("/[^a-zA-Z0-9\-\.\s]/", "\\\\$0", $filename)
除了数字,字母, - 和空格之外的所有内容......但我发现对于文件“test_1.jpg”,此命令会将其转换为“test_1.jpg”,但它不起作用,因为“_”不需要转换。
我担心会有更多“允许”字符,所以我的问题是......我怎样才能“克隆”linux控制台bash中“tab”键的转义功能?
谢谢!
答案 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);
}