2010-07-31 6 views
7

J'ai trouvé cette fonction qui teste si une chaîne est Windows nom de fichier et dossier convivial:Strip mauvais caractères de noms de fichiers de Windows

function is_valid_filename($name) { 
    $parts=preg_split("/(\/|".preg_quote("\\").")/",$name); 
    if (preg_match("/[a-z]:/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; 
} 

Ce que je préfère avoir est une fonction qui supprime toutes les mauvaises choses de la chaîne. J'ai essayé de remplacer preg_match avec preg_replace mais pas de cigare.

+0

* (référence) * [MSDN: Nommer des fichiers, chemins et espaces de noms] (http://msdn.microsoft.com/en-us/library/ aa365247% 28VS.85% 29.aspx) – Gordon

Répondre

17

Après cela donne de reference, Gordon:

$bad = array_merge(
     array_map('chr', range(0,31)), 
     array("<", ">", ":", '"', "/", "\\", "|", "?", "*")); 
$result = str_replace($bad, "", $filename); 
+1

C'est plus que ça. Par exemple, les noms réservés doivent également être supprimés. Windows ne vous laissera pas nommer un fichier 'CON.PHP' - nous savons tous que c'est une fonctionnalité, pas nous;) – Gordon

+0

@Gordon En fait, la page msdn doc que vous avez liée à dit' CON.PHP' est autorisée, juste déconseillée. – Artefacto

+0

@Artefacto l'essayer. Créez un nouveau fichier, nommez-le 'CON.php'. Windows (Vista) vous dira que c'est un nom d'appareil invalide et refusera de l'accepter. Vous pouvez également faire 'CON.whatever', même chose. – Gordon

Questions connexes