支持目录的PHP glob()

时间:2011-12-02 04:10:00

标签: php glob

在Windows计算机上,使用以下脚本:

<?php

mkdir("c:\\[test]");
file_put_contents("c:\\[test]\\test.txt", "some content");
chdir("c:\\[test]");
echo getcwd()."\n";
var_dump(glob('*'));

?>

显示:

C:\[test]
array(0) {
}

预计会这样:

C:\[test]
array(1) {
    [0]=>
    string(8) "test.txt"
}

我了解glob将括号视为特殊字符,在pattern参数中找到

模式*匹配当前工作目录中的任何文件。但是,glob() 表现得好像是用模式c:\\[test]\\*

运行的

然后括号被解释为模式的一部分,实际上是它们 是目录的一部分。

glob是否应将路径视为模式的一部分?我宁愿认为它应该使用当前目录作为起点,然后仅处理模式

(尝试总结):glob函数就像将c:\\[test]\\*作为匹配模式,并且正在尝试匹配c:\t\*c:\e\*或{ {1}}。但该模式实际上是c:\s\*,它不应该试图匹配其中任何一个。

1 个答案:

答案 0 :(得分:4)

这似乎是关于php.net上的错误报告中的一个问题:https://bugs.php.net/bug.php?id=33047

该主题的最后一篇文章是关于它不是一个bug,而是一个关于glob如何处理括号的问题,作为正则表达式的一部分。我不确定我是否同意。看起来你可以解决这个问题,除非你不能进入父文件夹。

如果您删除了位于[test]文件夹内的第一个要求,则可以使用以下语法获取文件列表:

chdir('..');
$glob = glob("[[]test[]]/*");

鉴于这些复杂情况,如果您在Windows机器上遇到问题,我建议不要使用glob函数,并查看其他文件列表函数,如readdir