当前位置: 首页 > 后端技术 > PHP

php的glob方法有个奇怪的问题就是在windows下转义无效,最后还有彩蛋

时间:2023-03-30 00:35:47 PHP

目录结构如下myfoldera.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($文件);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方法的定义#ifndefPHP_WIN32#include#else#include"win32/glob.h"#endif从这里我们可以看出有两组方法使用了glob方法在windows和linux中,在linux中是在linux底层使用的方法。让我们去win32/glob.c查看代码并找到以下关键代码行...#ifdefPHP_WIN32/*Forceskippingescapesequencesonwindows*duetotheambiguouswithpathbackslashes*/flags|=GLOB_NOESCAPE;#endif...翻译过来大概意思就是因为windows下目录的路径是正反斜杠混合的,所以强制不转义。也就是说,在Windows下,即使使用glob方法,也不会逃逸。啊,问题终于找到了!!!彩蛋来了,那么windows为什么要用反斜杠作为路径呢?因为windows的前身是ms-dos系统。在dos1中,没有目录结构的概念,而且当时微软的开发人员都有DEC背景,DEC操作系统使用/作为命令行参数分隔符。在dos2.0时代,系统增加了目录结构的概念,但是/已经被使用了,所以只能用一个代替,所以微软用反斜杠作为目录路径的分隔符。复活节彩蛋文本