2016-02-05 35 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 $ /我';' –