preg_match在验证 Windows 文件系统路径时不会按预期运行


preg_match doesn't behave as expected when validating windows filesystem path

我正在创建一个与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 如何处理字符串,但我在正则表达式在线中使用双反斜杠和正确的模式进行了测试,但 php 仍然返回空$matches

编辑:我正在使用 php-5.6.17

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

所以:

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

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

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