【问题标题】:PHP glob() doesnt find .htaccessPHP glob() 找不到 .htaccess
【发布时间】:2012-01-25 12:51:54
【问题描述】:

简单问题 - 如何使用 glob() 列出 .htaccess 文件?

【问题讨论】:

    标签: php .htaccess glob


    【解决方案1】:

    glob() 确实列出了“隐藏”文件(以. 开头的文件,包括目录...),但前提是您明确要求:

     glob(".*");
    

    过滤返回的glob() 数组以查找带有preg_grep.htaccess 条目:

     $files = glob(".*") AND $files = preg_grep('/\.htaccess$/', $files);
    

    glob 的替代方案当然是使用 scandir() 和一个过滤器(fnmatch 或正则表达式):

     preg_grep('/^\.\w+/', scandir("."))
    

    【讨论】:

    • 真正的特点是 PHP 不只是使 glob.h 系统调用常量 GLOB_PERIOD 可用。所以这更像是一种规避。
    • 是的,添加了代码,使用那个参数值格式来获取那些以句点开头的文件是相当长的。我想知道为什么没有整合常量。那是窗户爱吗?
    • 我会称之为错误。让我们来看一个实际的用例:删除所有文件,包括文件夹中的点文件:array_map('unlink', glob(__DIR__."/*/folder/*.*"));。预期结果:所有文件都消失了——但这不起作用。一个简单的通配符也不起作用:array_map('unlink', glob(__DIR__."/*/scripts/webinterface/*"));。必须结合 glob 模式以匹配两者:{.*,*.*}(点文件 + 所有文件)。而且我想,如果我将其归档为错误,我会得到预期的行为作为响应并直接关闭... =)。
    【解决方案2】:

    万一有人来这里,

    由于SPL 是在 PHP 中实现的,并提供了一些很酷的迭代器,您可以使用它来列出您的隐藏文件,例如 .htaccess 文件,或者它是替代的隐藏 linux 文件。

    使用DirectoryIterator列出所有目录内容,不包括...如下:

    $path = 'path/to/dir';
    $files = new DirectoryIterator($path);
    
    foreach ($files as $file) {
        // excluding the . and ..
        if ($file->isDot() === false) {
            // make some stuff
        }
    }
    

    【讨论】:

    • 我想我会为我目前的项目走这条路,但是……我有顾虑:php.net/manual/en/class.directoryiterator.php#122474你有没有遇到过类似的障碍?
    • 刚刚在我的 wamp 上运行了一些测试,->isDot() 正在用... 吞噬我的.htaccess 文件。也许如果有人希望全面调查并在手册中张贴注释,这将对未来的研究人员有所帮助。 php.net/manual/en/directoryiterator.isdot.php 似乎有必要对 ... 进行文字检查。
    • "你遇到过类似的障碍吗?"不,您的代码工作正常,我已经在带有 php5.6 的 Windows 服务器上对其进行了测试,它工作正常,不包括 ....DB_STORE 文件在你的情况下,它也不排除 . htaccess 文件
    • 将您的代码应用到具有以下内容的目录中 .htaccess , .DB_STORE , a.htaccess 给出以下输出:i.imgur.com/fWWCTa9.png
    猜你喜欢
    • 1970-01-01
    • 2016-06-02
    • 2018-02-16
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多