验证Windows文件系统路径时,preg_match的行为不符合预期

时间:2016-02-05 02:39:55

标签: php regex

我正在创建一个与Windows的文件系统文件路径匹配的正则表达式:

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 $ matches

编辑: 我正在使用php-5.6.17

1 个答案:

答案 0 :(得分:3)

你需要一个四重反斜杠:在单引号内,双反斜杠已经是一个转义的单反斜杠。 [尝试打印$regex变量]

所以:

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

或者使用这里更具可读性的nowdoc语法:

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