php的glob方法在windows下的转义无效的诡异问题。最后有彩蛋

目录结构以下php

myfolder
    a.txt
[myfolder]
    a.txt

代码:linux

$files = glob('myfolder/a.txt');
var_dump($files);
$files = glob('[myfolder]/a.txt');
var_dump($files);
//[]在使用中须要转义
$files = glob('\[myfolder\]/a.txt');
var_dump($files);

windows下输出git

test.php:7:
array(1) {
  [0] =>
  string(14) "myfolder/a.txt"
}
test.php:14:
array(0) {
}
test.php:21:
array(0) {
}

linux下输出github

test.php:7:
array(1) {
  [0]=>
  string(14) "myfolder/a.txt"
}
test.php:14:
array(0) {
}
test.php:21:
array(1) {
  [0]=>
  string(16) "[myfolder]/a.txt"
}

无论是windows仍是linux,[]在目录中都是正常字符c#

为何windows下就匹配不出来呢?windows

咱们去看php源码ui

查找PHP_FUNCTION(glob),操作系统

找到关键代码命令行

PHP_FUNCTION(glob)
{
    ...
    if (0 != (ret = glob(pattern, flags & GLOB_FLAGMASK, NULL, &globbuf))) {
    ...
}

继续查找glob方法的定义翻译

#ifndef PHP_WIN32
#include <glob.h>
#else
#include "win32/glob.h"
#endif

从这咱们看出,glob方法在windows和linux中是用的2套方法,在linux中用的是linux底层的方法。

咱们再去win32/glob.c下看代码

找到了下面这几行关键代码

...
#ifdef PHP_WIN32
    /* Force skipping escape sequences on windows
     * due to the ambiguity with path backslashes
     */
    flags |= GLOB_NOESCAPE;
#endif
...

翻译下大体意思是,因为windows下目录的路径正反斜杠混用,因此强制不转义

也就是说windows下,使用glob方法就算你用了反斜杠也不会转义

啊,问题终于找到了!!!

彩蛋来了

那么为何windows用反斜杠作路径呢?

由于windows前身是ms-dos系统。

dos1时尚未目录结构的概念,而且当时微软的开发人员有 DEC 的背景,DEC 的操做系统上是用 / 作命令行参数分割符。

到了dos2.0时代,系统新增了目录结构概念,可是 / 已经被用了,因此只能换一个喽,因而微软用反斜杠作了目录路径的分隔符。

彩蛋原文

相关文章
相关标签/搜索