2010-01-08 8 views
6

I nie wydają się znaleźć wyrażenie regularne dla JavaScript, który będzie testować w następujących przypadkach:Regex do sprawdzania poprawności ścieżki pliku w javascript

  • c: \ temp
  • D: \ NazwaKatalogu \ testowanie \
  • \ john-desktop \ tempdir \

można zobaczyć, co mam zamiar do. Potrzebuję go tylko do sprawdzenia poprawności ścieżki do pliku. Ale wydaje się, że wszystkie wyrażenia, które znalazłem, nie działają dla JavaScript.

+0

Co byś zrobić ze ścieżką pliku w JS? Zwykle JS nie ma żadnego dostępu do lokalnego systemu plików na dysku. Przesłanie ścieżki do pliku po stronie serwera również nie ma większego sensu, ponieważ serwer nie ma żadnego dostępu do lokalnego systemu plików na dysku klienta.W końcu myślę, że potrzebujesz 'input type =" file "' i nie martw się o walidację. – BalusC

+1

BalusC, rozumiem to. Aplikacja, którą tworzę, ma do czynienia z serwerem baz danych, który ma ścieżki do plików jako jeden z pól. Aby go edytować, chciałbym uzyskać pewną walidację. Mimo że użytkownik może potencjalnie umieścić nieprawidłową ścieżkę, przynajmniej to pomoże w upewnieniu się, że użytkownik umieszcza ścieżkę w ogóle. Ponadto jest to ścieżka po stronie serwera, więc typ wejściowy = "plik" nie będzie działał. Dzięki. – postalservice14

Odpowiedz

2

Spróbuj tego:

([a-zA-Z]:)?(\\[a-zA-Z0-9_-]+)+\\? 

EDIT:

@Bart mi myśleć o tym regexp. Ten powinien działać dobrze na ścieżkach systemu Windows.

^([a-zA-Z]:)?(\\[^<>:"/\\|?*]+)+\\?$ 
+0

Odpowiada to również pustemu ciągowi znaków. Zwróć też uwagę, że foldery w systemie Windows mogą mieć w sobie więcej niż zestaw '[a-zA-Z0-9 _-]'. –

+0

+1, ponieważ czuję się lepiej, gdy widzę kogoś, kto pisze regex jak miny; Jestem "normalny" po wszystkim –

+0

@Bart Masz rację, dziękuję. Naprawię to. Uwaga: wiem, ale jest to po prostu edytowalne. Napisałem base regex - pomysł jest jasny – Gaim

0

Można zacząć z:

^([a-zA-Z]:)?(\\[a-zA-Z0-9_\-]+)+\\? 

ten pasuje do wszystkich próbek.

+0

czy to działa dla php? – eronax59

1

myślę, że to będzie działać:

var reg = new RegExp("^(?>[a-z]:)?(?>\\|/)?([^\\/?%*:|\"<>\r\n]+(?>\\|/)?)+$", "i"); 

Właśnie wykluczyć wszystkie (?) nieprawidłowe znaki w nazwach plików. Powinien działać z międzynarodowymi nazwami plików (I dunno), jak również z dowolnym typem ścieżki systemu operacyjnego (z wyjątkami wymienionymi poniżej).

+0

Przepraszam, ale niektóre z twoich wykluczonych znaków są dozwolone, na przykład '% []' – Gaim

+0

% został zdefiniowany na stronie wiki, którą połączyłem jako symbol wieloznaczny w jednym systemie, więc dla zgodności nie było to dozwolone. Zaktualizowałem, aby usunąć [] z listy zakazu. –

+0

@Kevin Używam Linux Ubuntu (Jaunty), a% jest dozwolony. Mogę więc mieć plik, który nie pasuje do twojego wyrażenia regularnego (wiem, używanie tam znaków jest brzydkie, ale nie wiemy nic o przyszłych klientach) – Gaim

4

Oto sprawdzanie ścieżki systemu Windows, działa dobrze dla wszystkich reguł ścieżek systemu Windows.

var contPathWin = document.editConf.containerPathWin.value; 

if(contPathWin=="" || !windowsPathValidation(contPathWin)) 
{ 
    alert("please enter valid path"); 
    return false; 
} 

function windowsPathValidation(contwinpath) 
{ 
    if((contwinpath.charAt(0) != "\\" || contwinpath.charAt(1) != "\\") || (contwinpath.charAt(0) != "/" || contwinpath.charAt(1) != "/")) 
    { 
     if(!contwinpath.charAt(0).match(/^[a-zA-Z]/)) 
     { 
      return false; 
     } 
     if(!contwinpath.charAt(1).match(/^[:]/) || !contwinpath.charAt(2).match(/^[\/\\]/)) 
     { 
      return false; 
     } 

} 

i służy do sprawdzania ścieżki linux.

Spróbuj zrobić to w jednym stanie.

+0

Ta kontrola zakończy się niepowodzeniem ze ścieżkami zawierającymi znak minus "-" – Lemmy4555

1

Znalazłem przykład tutaj: http://regexlib.com/Search.aspx?k=file+name&AspxAutoDetectCookieSupport=1 i I zostały zmodyfikowane go dopasować pathes zaczynające '\':

^((([a-zA-Z]:|\\)\\)|(\\))?(((\.)|(\.\.)|([^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?))\\)*[^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?$ 

Wynika to jasno-regex wersja Niecytowany ze jest łatwiejsze do odczytania (naprawdę!).

Pasuje Ścieżki edukacyjne jak:

  • c: \ temp
  • \ temp
  • .. \ mój folder
  • üöä

itp