Php 从文件名中删除特殊字符

Php 从文件名中删除特殊字符,php,image,laravel,upload,special-characters,Php,Image,Laravel,Upload,Special Characters,我正在制作一个人们可以上传图片的网站。但是,当最终用户上载包含特殊字符或外来字符的图像时,图像确实会上载,但无法在网站上显示,就像服务器上不存在图像一样 我看到很多人在另一篇帖子上回答说我需要使用preg\u replace 但问题是,我真的不知道如何使用它。我将如何在代码中使用它 以下是我的控制器方法: public function upload(Requests\CreatePostsRequest $request) { $target_dir = "uploads/";

我正在制作一个人们可以上传图片的网站。但是,当最终用户上载包含特殊字符或外来字符的图像时,图像确实会上载,但无法在网站上显示,就像服务器上不存在图像一样

我看到很多人在另一篇帖子上回答说我需要使用
preg\u replace

但问题是,我真的不知道如何使用它。我将如何在代码中使用它

以下是我的控制器方法:

public function upload(Requests\CreatePostsRequest $request)
{
        $target_dir = "uploads/";
        $target_file = $target_dir . basename($_FILES['fileToUpload']["name"]);
        $uploadOk = 1;
        $findme   = ".";
        $pos = strpos($target_file, $findme);
        //echo $target_file;
        //dd($_POST);
        echo ini_get('upload_max_filesize');
        echo $_FILES["fileToUpload"]["error"];
        $imageFileType = strtolower(substr($target_file,$pos+1));
        if(isset($_POST["submit"])) {
            $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
                //$check = true;
                //dd($check);
            if($check !== false) {
                echo "File is an image - " . $check["mime"] . ".";
                $uploadOk = 1;
            } else {
                echo "File is not an image.";
                $uploadOk = 0;
            }
        }
        $filecheck = 0;
        $orgFileName = $target_file;
        while (file_exists($target_file)) {
            $target_file = substr($orgFileName,0,$pos).$filecheck.substr($orgFileName,$pos);
            $filecheck++;

            $uploadOk = 1;
        }

        if ($_FILES["fileToUpload"]["size"] > 500000000*8) {
            echo "Sorry, your file is too large.";
            $uploadOk = 0;
        }

        if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
        && $imageFileType != "gif" ) {
            echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
                echo $imageFileType;
            $uploadOk = 0;
        }

        if ($uploadOk == 0) {
            echo "Sorry, your file was not uploaded.";

        } else {
            if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
                echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";

                        $post = new Posts($request->all());
                        $post->fileToUpload = $target_file;
                        Auth::user()->posts()->save($post);
            } else {
                echo "Sorry, there was an error uploading your file.";
            }
        }
        return redirect('');
        echo $target_file;
    }
使用preg替换:

$target_file = $target_dir . preg_replace("/[^a-z0-9\_\-\.]/i", '', basename($_FILES['fileToUpload']["name"]));
这将删除所有不是字母(a-z)、数字(0-9)或破折号、下划线或点(我们希望保留文件扩展名)的字符。最后的
i
标志使匹配不区分大小写

更新 要缩短表达式,可以将
a-z0-9\
-part替换为单词token
\w


然后模式将是:
/[^\w\-\.]/
。这里我们不需要
i
标志,因为单词token为我们处理这个问题。

这不起作用,它不会删除文件名中的“+”。我做得对吗<代码>$target_dir=“uploads/”;$target\u file=$target\u dir。basename($_文件['fileToUpload'][“名称]);$target\u file=preg\u replace(“/[^A-Za-z0-9\\u\-]/”,“$target\u file”)@EiðurGeirVilhelmsson-太棒了。是的,我的保存按钮有点快。我确实换了几次。。莱卡·蒂尔:)@MagnusEriksson你真厉害!为了那些失败的选民。如果你觉得这个答案质量太差,你想投反对票,请添加一条评论解释原因。如果你不知道问题出在哪里,就很难找到答案。@MagnusEriksson你的解决方案对我来说非常有效!