2016-02-05 36 views
3

我創建與Windows的文件系統的文件路徑功能相匹配的正則表達式時,如預期:的preg_match不表現驗證窗口文件系統路徑

c:\WINDOWS\SYSTEM32\cmd\a.php //valid match 
c:\WINDOWS\SYSTEM32\cmd\a  //invalid match 

這種模式和代碼:

function validate_filepath() 
{ 
    $view_path = 'c:\WINDOWS\SYSTEM32\cmd\a.php'; 

    // ^(?:[\w]\:)     # matching drive 
    //(?:\\[^\\:*?"<>|\r\n]+)+\\ # matching folder 
    // [^\\:*?"<>|\r\n]+\.(?:php) # matching file and php extension 
    $regex = '/^(?:[\w]\:)(?:\\[^\\:*?"<>|\r\n]+)+\\[^\\:*?"<>|\r\n]+\.(?:php)/mi'; 

    preg_match($regex, $view_path, $matches); 
    return($matches[0]); 
} 

我已經使用https://regex101.com嘗試過這種模式,並且它與路徑匹配,但在使用PHP的preg_match時不會發生。我在哪裏犯了一個錯誤?

我還沒有真正看過PHP如何處理字符串,但我使用雙反斜線和regexonline正確的方式進行測試,但仍然PHP返回null $匹配

編輯: 我使用的PHP 5.6.17

+0

提示:有一個看看'x'正則表達式修改爲直列評論 – bwoebi

回答

3

這裏需要一個四重反斜槓:在單引號內,雙反斜槓已經是一個轉義的單個反斜槓。 [嘗試打印$regex變量]

所以:

$regex = '/^(?:[\w]\\:)(?:\\\\[^\\:*?"<>|\r\n]+)+\\\\[^\\\\:*?"<>|\r\n]+\\.(?:php)/mi'; 

或可選擇地使用這裏更具可讀性nowdoc語法:

$regex = <<<'REGEX' 
/^(?:[\w]\:)(?:\\[^\\:*?"<>|\r\n]+)+\\[^\\:*?"<>|\r\n]+\.(?:php)/mi 
REGEX; 
+2

http://xkcd.com/1638/ – thanksd

+1

@thanksd Eih,是的。我們當然需要一個安裝腳本,然後創建包含八個反斜槓的文件。 – bwoebi

+1

沒有無用的東西,模式可以縮短爲:'$ regex ='/^[AZ]:(?:\\\\ [^ \\:*?「<> | \ r \ n] +)+ \ .PHP $ /我';' –