2010-05-03 3 views
7

Quelqu'un peut-il me s'il vous plaît aider avec ce preg_matchPHP expression régulière pour correspondre à une filepath

if (preg_match('~[^A-Za-z0-9_\./\]~', $filepath)) 
    // Show Error message. 

je dois correspondre à une possible filepath. Donc, je dois vérifier les doubles barres obliques, etc. chaînes de chemin de fichier valides devraient ressembler à ceci seulement:

mydir/aFile.php 

ou

mydir/another_dir/anyfile.js 

Ainsi, une barre oblique au début de cette chaîne doit être vérifié aussi. S'il vous plaît aider.

Merci :)

EDIT: De plus, les gars, ce chemin est en cours de lecture à partir d'un fichier texte. Ce n'est pas un chemin de fichier sur le système. Donc j'espère qu'il devrait être capable de supporter tous les systèmes dans ce cas.

RE-EDIT: Désolé, mais la chaîne peut aussi ressembler à ceci aussi: myfile.php, ou myfile.js ou myfile.anything

Comment puis-je autoriser des chaînes comme cela aussi ?? Je suis désolé de ne pas être trop précis à ce sujet avant ...

+0

Seuls les deux chemins d'échantillonnage que vous avez indiqués doivent correspondre? – codaddict

+0

Toute extension de fichier doit correspondre. Impossible d'avoir des barres obliques devant la chaîne et aucune barre oblique à la toute fin de la chaîne. C'est la seule limite à cela, et ce doit être les caractères A-Z, a-z, 0-9, ou avoir et souligner ou un point dedans. C'est tout. – SoLoGHoST

+0

Pour quels systèmes de fichiers le chemin doit-il être valide? – Gumbo

Répondre

10

Vous pouvez faire:

if(preg_match('#^(\w+/){1,2}\w+\.\w+$#',$path)) { 
     // valid path. 
}else{ 
     // invalid path 
} 
+0

puis-je utiliser cela comme pour vérifier uniquement les chemins invalides? 'if (! preg_match ('#^(\ w + /) {1,2} \ w + \. \ w + $ #', $ chemin))' – SoLoGHoST

+0

Oui, vous pouvez le faire. – codaddict

+0

Désolé, cela ne fonctionne pas, je l'ai essayé, mais il va un message d'erreur quand j'ai cette chaîne: 'myfile.php' – SoLoGHoST

12

S'il vous plaît Notez qu'il ya de nombreux types de chemins de fichiers possibles. Par exemple:

  • "./"
  • "../"
  • "........" (oui cela peut être le nom d'un fichier)
  • « Fichier/file.txt "
  • "fichier/fichier"
  • "fichier.txt"
  • "fichier /../.// fichier/fichier/fichier"
  • " /file/.././ /file/file/.file "(UNIX)
  • "C: \ Windows \" (Windows)
  • "C: \ Windows \ asd/asd" (Windows, php accepte cette)
  • « fichier /../.// fichier/fichier/fichier ! @ # $ »
  • "fichier /../.// file/file/[email protected]#.php.php.php.pdf.php"

Tous ces chemins de fichiers sont valides. Je ne peux pas penser à une simple regex qui peut le rendre parfait.

Supposons qu'il est juste un chemin UNIX pour l'instant, ce que je pense devrait fonctionner pour la plupart des cas:

preg_match('/^[^*?"<>|:]*$/',$path) 

Il vérifie toutes les cordes pour ^, *, « , <,>, |? ,: (supprime ceci pour Windows) Ce sont tous des caractères que Windows ne permet pas de nommer, avec/et.Si c'est Windows, vous devez remplacer le chemin \ par/puis l'exploser et vérifier s'il est absolu. Voici un exemple qui fonctionne à la fois dans unix et windows.

function is_filepath($path) 
{ 
    $path = trim($path); 
    if(preg_match('/^[^*?"<>|:]*$/',$path)) return true; // good to go 

    if(!defined('WINDOWS_SERVER')) 
    { 
     $tmp = dirname(__FILE__); 
     if (strpos($tmp, '/', 0)!==false) define('WINDOWS_SERVER', false); 
     else define('WINDOWS_SERVER', true); 
    } 
    /*first, we need to check if the system is windows*/ 
    if(WINDOWS_SERVER) 
    { 
     if(strpos($path, ":") == 1 && preg_match('/[a-zA-Z]/', $path[0])) // check if it's something like C:\ 
     { 
      $tmp = substr($path,2); 
      $bool = preg_match('/^[^*?"<>|:]*$/',$tmp); 
      return ($bool == 1); // so that it will return only true and false 
     } 
     return false; 
    } 
    //else // else is not needed 
     return false; // that t 
} 
+0

puis-je concaténer tous les regex possibles dans une regex – eronax59

Questions connexes