php的glob方法在windows下的转义无效的诡异问题

上官元恒 · · 61 次点击 · · 开始浏览    

目录结构如下

myfolder
    a.txt
[myfolder]
    a.txt

代码:

$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下输出

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

linux下输出

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,[]在目录中都是正常字符

为什么windows下就匹配不出来呢?

我们去看php源码

查找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方法就算你用了反斜杠也不会转义

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

本文来自:Segmentfault

感谢作者:上官元恒

查看原文:php的glob方法在windows下的转义无效的诡异问题

61 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet