рекомендуется заменить некоторые символы, которые могут встречаться в именах файлов на окнах.
Unix может обрабатывать практически любой символ в имени файла (но не "/" и 0x00 [нулевой символ]), но для предотвращения проблем кодирования и трудностей при загрузке файла я бы предложил заменить все, что не соответствует
/[A-Za-Z0-9_-\.]/g
, который удовлетворяет полностью переносимому формату имени файла POSIX.
так что preg_replace("/[^A-Za-Z0-9_-\.]/g","_",$filename);
сделает хорошую работу.
более щедрым подходом было бы заменить только |\?*<":>+[]\x00/
, который оставляет символы специального языка, такие как öäü, нетронутыми и совместим с FAT32, NTFS, любым Unix и Mac OS X.
в этом случае используйте preg_replace("/[\|\\\?\*<\":>\+\[\]\/]\x00/g","_",$filename);