使用preg_replace更改PHP文件上载名称

时间:2015-01-07 13:21:53

标签: php file upload preg-replace

我试图使我的文件uploades更安全,以便不会破坏任何链接。我试过编写一个代码,首先删除所有坏的url字符,如果存在相同的名称,它应该增加文件名后面的数字。

我的代码可以正常使用重复名称上增加的数字,但字符串如下:嗨这是一个测试 - 不会更改为hithisisatest

我尝试运行的代码如下:

if ($myFile["error"] !== UPLOAD_ERR_OK) {
        CUSTOM HEADER
        exit;
    }

    // ensure a safe filename
    $name = preg_replace("/[^a-z0-9_\.\-[:space:]]/i", "_", $myFile["name"]);

    // don't overwrite an existing file
    $i = 0;
    $parts = pathinfo($name);
    while (file_exists(UPLOAD_DIR . $name)) {
        $i++;
        $name = $parts["filename"] . "-" . $i . "." . $parts["extension"];
    }

    // preserve file from temporary directory
    $success = move_uploaded_file($myFile["tmp_name"],
        UPLOAD_DIR . $name);

    if (!$success) { 
        CUSTOM HEADER
        exit;
    }

1 个答案:

答案 0 :(得分:0)

您在preg_replace中使用的正则表达式旨在将一些选定的字符(abc等)保留在$name中,并用下划线替换所有其他(“坏”)字符:

$name = preg_replace("/[^a-z0-9_\.\-[:space:]]/i", "_", $myFile["name"]);

由于[:space:]列在这些字符中,因此hi this is a test等名称的空格保持不变应该不足为奇。

删除[:space:],您将获得hi_this_is_a_test文件名hi this is a test

$name = preg_replace("/[^a-z0-9_\.\-]/i", "_", $myFile["name"]);
// hi_this_is_a_test

如果您真的想明确删除问题中暗示的“不良”字符,您还应该在""调用中将替换字符串设置为"_"而不是reg_replace

$name = preg_replace("/[^a-z0-9_\.\-]/i", "", $myFile["name"]);
// hithisisatest