2015-10-20 49 views
1

我需要驗證基於Windows的目錄的用戶文本條目,沒有目錄選擇器的排序,它只是一個文本字段。PHP正則表達式的Windows目錄 - preg_match

我寫使用http://regex101.com/以下正則表達式這對於我的需求的作品充分:

^[a-zA-Z]\:[\/,\\].{1,} 

將匹配例如在在線工具以下目錄:

C:/Users/Charlie/Dropbox 
D:/Users/Bob/Quotes 
F:/Quotes 

的問題是,當在我的應用程序中使用它時,preg_match不符合上述任何一項。它不返回true,並且preg_last_error()返回0,它也表示錯誤的返回值。

使用的確切代碼:

if(preg_match('/^[a-zA-Z]\:[\/,\\].{1,}/', $directory)) { } 

任何幫助非常讚賞。

+0

什麼在$目錄? – Chris

+0

@Chris上面顯示的任何目錄都不起作用。已經在服務器端(在'preg_match'之前)回顯它們,並且它們完全按照預期進行打印。 – Charlie

+0

嘗試定義一個輸出數組並打印它。preg_match(「/^[a-zA-Z] \:[\ /,\\]。{1,} /」,$ directory,$ output_array); – Chris

回答

1

您需要使用四反斜槓,以符合一個反斜槓:

if(preg_match('/^[a-zA-Z]\:[\/,\\\\].{1,}/', 'C:/Users/Charlie/Dropbox')) { 
//        ^^^^ 

IDEONE demo

否則,反斜槓只是逃避]和廢墟正則表達式字符類。

注意,代替{1,}你可以使用+量詞,這意味着1次或多次出現和你沒有逃跑的結腸。

我也不明白你爲什麼在字符類中有一個逗號,這個字符被當作文字對待。我想你只想匹配\/[\/,\\\]?其後,通過正則表達式看起來像

'/^[a-zA-Z]:[\/\\\\].+/' 

another demo

+1

這樣做,謝謝!雖然值得注意的是我實際上不得不使用四重反斜槓,但三重似乎以某種方式避免了最後的引用,而將文件的其餘部分留在引號中。現在我已經用'+'量詞替換了'多於一個'。逗號意圖作爲兩個角色之間的分隔符是的,現在意識到這是不正確的,現在已經更新了這個。我已經測試過它,並且一切正常,再次感謝。 – Charlie

+1

我發現一個[後解釋說,3和4反斜槓都可以用來匹配文字'''''](http://stackoverflow.com/a/15369828/3832970),但它確實建議使用4個反斜槓匹配一個文字'''''。我相應地更新了答案。我認爲這3個轉義符的工作方式與Python相同 - 當轉義序列不能被解釋爲這樣時,反斜線被視爲文字。也許,不是在所有情況下 - 比如你的。 –