2010-01-08 144 views
6

似乎在JavaScript我不能找到JavaScript的正則表達式,這將考驗以下情況:正則表達式的文件路徑驗證

  • C:\ TEMP
  • d:\目錄名\測試\
  • \約翰 - 桌面\ TEMPDIR \

你可以看到什麼,我去了。我只需要它來驗證文件路徑。但似乎我發現的所有表達式都不適用於JavaScript。

+0

你會用JS中的文件路徑嗎?通常JS不具有對本地磁盤文件系統的訪問權限。將文件路徑發送到服務器端也沒有多大意義,因爲服務器不能訪問客戶端的本地磁盤文件系統。畢竟我認爲你只需要'input type =「file」'而不用擔心驗證。 – BalusC 2010-01-09 01:06:25

+1

BalusC,我明白這一點。我正在創建的應用程序正在處理一個數據庫服務器,它的文件路徑就是其中一個字段。爲了進行編輯,我想要進行一些驗證。即使用戶可能放置了無效的路徑,至少這將有助於確保用戶放入路徑。此外,這是一個服務器端路徑,所以input type =「file」將不起作用。謝謝。 – postalservice14 2010-01-10 09:42:12

回答

2

試試這個:

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

編輯:

@Bart讓我想起這個正則表達式。這個應該適合windows的路徑。

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

也匹配一個空字符串。另外請注意,Windows中的文件夾可能比其中的集合[[a-zA-Z0-9 _-]]多。 – 2010-01-08 20:00:15

+0

+1,因爲當我看到其他人寫了像地雷這樣的正則表達式時,我感覺更好;畢竟我是「正常」 – 2010-01-08 20:00:36

+0

@Bart你是對的,謝謝。我會解決它。注意:我知道,但它只是可編輯的。我寫了基本的正則表達式 - 想法很明確 – Gaim 2010-01-08 20:01:50

0

你可以這樣開始:

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

這所有的樣本相匹配。

+0

這個問題是否適用於php? – eronax59 2016-07-27 10:01:58

1

我認爲這將工作:

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

我剛剛排除了所有(?)無效字符的文件名。應該使用國際文件名(我不知道)以及任何操作系統路徑類型(下面有例外)。

+0

對不起,但有些被排除的字符是允許的,例如'%[]' – Gaim 2010-01-08 20:13:42

+0

%是在作爲通配符鏈接到一個系統的wiki頁面上定義的,因此爲了兼容性而不允許。我已經更新,以便從禁止列表中刪除[]。 – 2010-01-08 20:18:15

+0

@Kevin我正在使用Linux Ubuntu(Jaunty)和%有允許的字符。所以我可以有一個與你的正則表達式不匹配的文件(我知道,字符的使用是醜陋的,但我們對未來的客戶一無所知) – Gaim 2010-01-08 20:22:29

4

這是Windows路徑驗證,它適用於所有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; 
     } 

} 

這是用於linux路徑驗證。

var contPathLinux = document.addSvmEncryption.containerPathLinux.value; 

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

function linuxPathValidation(contPathLinux) 
{ 
    for(var k=0;k<contPathLinux.length;k++){ 
     if(contPathLinux.charAt(k).match(/^[\\]$/)){ 
      return false; 
     } 
    } 
    if(contPathLinux.charAt(0) != "/") 
    { 
     return false; 
    } 
    if(contPathLinux.charAt(0) == "/" && contPathLinux.charAt(1) == "/") 
    { 
     return false; 
    } 
    return true; 
} 

試着讓它在單一的條件。

+0

此檢查將失敗,路徑包含一個負號「 - 」 – Lemmy4555 2017-02-02 17:44:36

1

我發現這裏的例子: http://regexlib.com/Search.aspx?k=file+name&AspxAutoDetectCookieSupport=1 ,我已經修改了它匹配開始'\' pathes:

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

這是明確的正則表達式轉義的版本更容易閱讀(真的! )。

它匹配pathes像:

  • C:\ TEMP
  • \ TEMP
  • .. \我的文件夾
  • UOA