我在处理用户上传的文件名时遇到问题,我必须处理这些文件名。当我尝试访问它们时,因为其中一些具有特殊字符,所以使用的命令表示找不到文件或类似文件。
我使用了 escapeshellcmd 但没有成功。
当我在 Linux 控制台中使用“tab”键时(当您开始输入文件名并且希望完成时),bash 会正确转义文件名,如果我完全使用“转义”文件名,它就会起作用。
我试过这个:
preg_replace("/[^a-zA-Z0-9\-\.\s]/", "\\\\$0", $filename)
转义除数字、字母、-和空格之外的所有内容...但我发现对于文件“test_1.jpg”,此命令将其转换为“test_1.jpg”,并且它不起作用,因为“_”不需要转换。
我担心可能会有更多“允许”的字符,所以我的问题是......我如何在linux控制台bash中“克隆”“tab”键的转义功能?
如果你想使用文件名作为 shell 命令参数,你可以使用函数 escapeshellarg。
我使用它作为文件名和从博客文章标题等中创建 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);
如果您直接在 Web 服务器上访问这些文件,您的文件名需要使用 urlencode 进行 url 编码,而不是 escapeshellcmd
这是我整理的功能,希望对你有帮助
您可以通过添加|来添加更多内容与另一个转义字符
public function linuxFilename($file)
{
//make the linux filename perfect
return preg_replace("/ |'|\(|\)/", '\\\${0}', $file);
}