【问题标题】:preg_match doesn't behave as expected when validating windows filesystem path验证 Windows 文件系统路径时 preg_match 的行为不符合预期
【发布时间】:2016-02-05 02:39:54
【问题描述】:

我正在创建一个与 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

【问题讨论】:

  • 提示:查看 x 正则表达式修饰符以进行内联评论

标签: php regex


【解决方案1】:

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

所以:

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

或者使用这里更易读的 nowdoc 语法:

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

【讨论】:

  • @thanksd 嗯,是的。我们肯定需要一个安装脚本来创建这个包含八元反斜杠的文件。
  • 没有无用的东西,模式可以缩短为:$regex = '/^[A-Z]:(?:\\\\[^\\:*?"&lt;&gt;|\r\n]+)+\.php$/i';
猜你喜欢
  • 2011-12-08
  • 2023-04-05
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多