PHP:像 Linux 一样转义文件名

问题描述 投票:0回答:4

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

我使用了 escapeshellcmd 但没有成功。

当我在 Linux 控制台中使用“tab”键时(当您开始输入文件名并且希望完成时),bash 会正确转义文件名,如果我完全使用“转义”文件名,它就会起作用。

我试过这个:

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

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

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

php escaping filenames
4个回答
3
投票

如果你想使用文件名作为 shell 命令参数,你可以使用函数 escapeshellarg


1
投票

我使用它作为文件名和从博客文章标题等中创建 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
投票

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


0
投票

这是我整理的功能,希望对你有帮助

您可以通过添加|来添加更多内容与另一个转义字符

public function linuxFilename($file)
{
    //make the linux filename perfect
    return preg_replace("/ |'|\(|\)/", '\\\${0}', $file);
}
© www.soinside.com 2019 - 2024. All rights reserved.