2010-05-03 14 views
7

Czy ktoś mógłby mi pomóc z tym preg_matchPHP wyrażenie regularne, aby dopasować filepath

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

muszę dopasować możliwie filepath. Więc muszę sprawdzić podwójnych ukośników itp Prawidłowe ciągi ścieżek plik powinien wyglądać tak tylko:

mydir/aFile.php 

lub

mydir/another_dir/anyfile.js 

tak ukośnik na początku tego łańcucha powinny być sprawdzane również. Proszę pomóż.

Dzięki :)

EDIT: Ponadto, chłopaki, ta ścieżka jest odczytywana od wewnątrz pliku tekstowego. To nie jest ścieżka do pliku w systemie. Miejmy nadzieję, że powinna być w stanie obsługiwać wszystkie systemy w tym przypadku.

RE-EDIT: Niestety, ale łańcuch może również wyglądać zbyt: myfile.php lub myfile.js lub myfile.anything

Jak mogę pozwolić sznurki jak to jak dobrze ?? Przepraszam, że nie jest zbyt szczegółowe na ten temat przed ...

+0

Tylko te dwie ścieżki próbne, które pokazujesz, powinny być dopasowane? – codaddict

+0

Każde rozszerzenie pliku powinno być dopasowane. Nie może mieć żadnych ukośników przed ciągiem i nie może mieć żadnych ukośników na samym końcu sznurka. To jedyny limit do tego, i muszą to być znaki A-Z, a-z, 0-9, i mieć i podkreślenia lub kropkę w nim. To wszystko. – SoLoGHoST

+0

Jakie systemy plików powinna obowiązywać ścieżka? – Gumbo

Odpowiedz

10

można zrobić:

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

Czy mogę tego używać tak, aby sprawdzać tylko nieprawidłowe ścieżki? 'if (! preg_match ('#^(\ w + /) {1,2} \ w + \. \ w + $ #', $ path))' – SoLoGHoST

+0

Tak, możesz to zrobić. – codaddict

+0

Niestety, to nie działa, próbowałem, ale pojawi się komunikat o błędzie, gdy mam ten ciąg: 'myfile.php' – SoLoGHoST

12

Proszę zauważyć, że istnieje wiele rodzajów możliwych ścieżek plików. Na przykład:

  • "./"
  • "../"
  • "........" (tak to może być nazwa pliku jest)
  • „file/plik.txt "
  • "file/plik"
  • "plik.txt"
  • "file /../.// plik/file/plik"
  • " /file/.././ /file/file/.file "(UNIX)
  • "C: \ Windows \" (Windows)
  • "C: \ Windows \ USA/USA" (Windows, PHP to akceptuje)
  • „plik /../.// plików// pliku ! @ # $”
  • "file /../.// file/file/[email protected]#.php.php.php.pdf.php"

Wszystkie te ścieżki pliku są poprawne. Nie mogę wymyślić prostego wyrażenia, które może uczynić go idealnym.

Załóżmy, że to tylko ścieżka UNIX na razie, jest to, co myślę powinny działać w większości przypadków:

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

Sprawdza cały ciąg na ^, *”, <,>, |? ,: (usuń to dla Windows) .Te są wszystkie znaki, których Windows nie pozwala na nazwę pliku, wraz z/i.

Jeśli to okna, powinieneś zamienić ścieżkę \ na /, a następnie ją rozbić i sprawdzić, czy jest absolutna. Oto jeden przykład, który działa zarówno w systemie UNIX, jak i 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

Czy mogę zastosować wszystkie możliwe wyrażenia regularne w jednym wyraże regularnym – eronax59

Powiązane problemy