:"/\\\|?*]| # @internal 1. [\x00-\x1F]| # @internal 2. [#\[\]@!$&\'()+,;=]| # @internal 3. [{}^\~`] # @internal 4. ~x', '-', $name ); // reduce consecutive characters $name = (string) preg_replace( [ '/ +/', // "file name.zip" becomes "file name.zip" '/_+/', // "file___name.zip" becomes "file_name.zip" '/ - -+/', // "file - -name.zip" becomes "file--name.zip" '/-+/', // "file--name.zip" becomes "file-name.zip" ], [ ' ', '_', '-', '-', ], $name ); $name = trim((string)$name, '.-_ '); //remove dot, hyphen, underscore, or space from start and end of string /* Ensure filename is not a reserved Windows name, otherwise remove */ if (in_array(strtolower($name), self::$reservedWindowsNames, true)) { $name = ''; } /* * Ensure filename is not longer than 255 bytes http://serverfault.com/a/9548/44086, otherwise shorten */ $extension = 'php'; $maxLength = 255 - ($extension ? strlen($extension) + 1 : 0); /* Use multibyte aware functions, if the server supports it */ if (function_exists('mb_strcut') && function_exists('mb_detect_encoding')) { $name = mb_strcut($name, 0, $maxLength, (string)mb_detect_encoding($name)); } else { $name = substr($name, 0, $maxLength); } if (empty($name)) { $name = 'unnamed-file'; } return $name; } }