2010-05-03 19 views
7

Kann jemand bitte helfen Sie mir mit diesem preg_matchPHP regulären Ausdruck entsprechen einem filepath

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

Ich brauche eine mögliche Filepath anzupassen. Also muss ich für doppelte Schrägstriche überprüfen usw. Gültige Dateipfad Strings wie dieser nur aussehen sollte:

mydir/aFile.php 

oder

mydir/another_dir/anyfile.js 

So ein Schrägstrich am Anfang dieser Zeichenfolge sollte auch überprüft werden. Bitte helfen Sie.

Thanks :)

EDIT: Auch Jungs, wird dieser Pfad aus einer Textdatei gelesen werden. Es ist kein Dateipfad auf dem System. Also hoffentlich sollte es in diesem Fall alle Systeme unterstützen können.

RE-EDIT: Sorry, aber der String kann auch sehen auch dies wie: myfile.php oder myfile.js oder myfile.anything

Wie kann ich erlauben Strings wie dies auch ?? Ich entschuldige mich für, bevor sie auf diese nicht zu spezifisch sein ...

+0

Nur die von Ihnen gezeigten zwei Beispielpfade sollten übereinstimmen? – codaddict

+0

Jede Dateierweiterung sollte übereinstimmen. Vor der Zeichenfolge dürfen keine Schrägstriche stehen und am Ende der Zeichenfolge dürfen keine Schrägstriche stehen. Das ist die einzige Grenze dafür, und es müssen die Buchstaben A-Z, a-z, 0-9, oder und und oder ein Punkt sein. Das ist alles. – SoLoGHoST

+0

Für welche Dateisysteme sollte der Pfad gelten? – Gumbo

Antwort

10

Sie tun können:

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

kann ich dies so verwenden, um nur nach ungültigen Pfaden zu suchen? 'if (! preg_match ('#^(\ w + /) {1,2} \ w + \. \ w + $ #', $ pfad))' – SoLoGHoST

+0

Ja, das kannst du tun. – codaddict

+0

Sorry, das funktioniert nicht, ich habe es versucht, aber es wird eine Fehlermeldung angezeigt, wenn ich diesen String habe: 'myfile.php' – SoLoGHoST

12

Bitte beachten Sie, dass es viele Arten von möglichen Dateipfade sind. Zum Beispiel:

  • "./"
  • "../"
  • "........" (ja dieser Name einer Datei sein kann)
  • „Datei/file.txt "
  • "Datei/file"
  • "file.txt"
  • "Datei /../.// Datei/file/Datei"
  • " /file/.././ /file/file/.file "(UNIX)
  • "C: \ Windows \" (Windows)
  • "C: \ Windows \ asd/asd" (Windows, PHP akzeptiert dies)
  • „Datei /../.// Datei/file/Datei ! @ # $“
  • "Datei /../.// file/file/[email protected]#.php.php.php.pdf.php"

Alle diese Dateipfade gültig sind. Ich kann mir keine einfache Regex vorstellen, die es perfekt machen könnte.

Nehmen wir an, es ist nur ein UNIX-Pfad für jetzt, ist es das, was ich denke, sollte für die meisten Fällen funktionieren:

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

alle String überprüft für ^, *, „, <,>, |? ,: (entfernen Sie dies für Windows) Dies sind alle Zeichen, die Windows Dateinamen nicht zulassen, zusammen mit/und.

Wenn es Windows ist, sollten Sie den Pfad \ mit/ersetzen und dann explodieren und überprüfen, ob es absolut ist. Hier ist ein Beispiel, das in Unix und Windows funktioniert.

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

kann ich alle möglichen Regex in einem Regex erfassen – eronax59

Verwandte Themen