2010-05-03 11 views
7

Qualcuno può aiutarmi con questo preg_matchPHP espressione regolare per abbinare un percorso file

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

ho bisogno di corrispondere a un possibile percorso file. Così ho bisogno di verificare la presenza di doppie barre, ecc validi stringhe di percorso del file dovrebbe essere simile a questo solo:

mydir/aFile.php 

o

mydir/another_dir/anyfile.js 

Quindi una barra all'inizio di questa stringa dovrebbe essere controllato anche. Per favore aiuto.

Grazie :)

EDIT: Inoltre, ragazzi, questo percorso viene letto da un file di testo. Non è un percorso file sul sistema. Quindi spero che dovrebbe essere in grado di supportare tutti i sistemi in questo caso.

RE-EDIT: Ci dispiace, ma la corda può anche apparire come anche questo: myfile.php, o myfile.js, o myfile.anything

Come faccio a consentire stringhe come questo così ?? Mi scuso per non essere troppo specifico su questo prima ...

+0

Solo i due percorsi di esempio mostrati devono essere abbinati? – codaddict

+0

Qualsiasi estensione del file deve corrispondere. Non è possibile avere alcuna barra davanti alla stringa e non può avere alcuna barra alla fine della stringa. Questo è l'unico limite ad esso, e deve essere caratteri A-Z, a-z, 0-9, o ha e sottolineatura o un punto in esso. È tutto. – SoLoGHoST

+0

Per quali file system deve essere valido il percorso? – Gumbo

risposta

10

si può fare:

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

posso usarlo in questo modo per controllare solo i percorsi non validi? 'if (! preg_match ('#^(\ w + /) {1,2} \ w + \. \ w + $ #', $ path))' – SoLoGHoST

+0

Sì, puoi farlo. – codaddict

+0

Scusa, non funziona, l'ho provato, ma verrà visualizzato un messaggio di errore quando ho questa stringa: 'myfile.php' – SoLoGHoST

12

Si prega di notare che ci sono molti tipi di possibili percorsi di file. Per esempio:

  • "./"
  • "../"
  • "........" (sì, questo può essere il nome di un file) "File
  • /file.txt "
  • "file/file"
  • "file.txt"
  • "di file /../.// file/file/file"
  • " /file/.././ /file/file/.file "(UNIX)
  • "C: \ Windows \" (Windows)
  • "C: \ Windows \ ASD/ASD" (Windows, php accetta questo)
  • "di file /../.// file/file/File ! @ # $"
  • "File /../.// file/file/[email protected]#.php.php.php.pdf.php"

Tutti questi percorsi di file sono validi. Non riesco a pensare a una semplice regex che possa renderla perfetta.

Supponiamo è solo un percorso UNIX, per ora, questo è quello che penso dovrebbe funzionare per la maggior parte dei casi:

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

Esso controlla tutte le stringhe per ^, *,,", <,>, |? ,: (rimuovi questo per Windows). Sono tutti caratteri che Windows non consente il nome del file, insieme a/e.

Se è Windows, è necessario sostituire il percorso \ con/e quindi esploderlo e verificare se è assoluto. Ecco un esempio che funziona sia in unix che in 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

posso concat tutto il regex possibile in una regex – eronax59

Problemi correlati