Я нашел эту функцию, которая проверяет, является ли строка именем файла Windows и папкой:
function is_valid_filename($name) { $parts=preg_split("/(\/|".preg_quote("\\").")/",$name); if (preg_match("/[az]:/i",$parts[0])) { unset($parts[0]); } foreach ($parts as $part) { print "part = '$part'<br>"; if (preg_match("/[".preg_quote("^|?*<\":>","/")."\a\b\c\e\x\v\s]/",$part)||preg_match("/^(PRN|CON|AUX|CLOCK$|NUL|COMd|LPTd)$/im",str_replace(".","\n",$part))) { return false; } } return true; }
Я бы предпочел, чтобы это была функция, которая удаляет все плохие вещи из строки. Я попытался в основном заменить preg_match на preg_replace, но не сигару.
Следуя указаниям Гордона, это дает:
$bad = array_merge( array_map('chr', range(0,31)), array("<", ">", ":", '"', "/", "\\", "|", "?", "*")); $result = str_replace($bad, "", $filename);