PHP glob() 函数(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 PHP 开发中,处理文件系统是一个常见需求,无论是遍历目录、查找特定文件,还是根据模式匹配文件名。而 PHP glob() 函数正是一款专门为此设计的工具。它能通过简单的语法实现复杂的文件路径匹配,甚至替代部分复杂的循环逻辑。对于编程初学者而言,理解这一函数能显著提升文件操作的效率;而中级开发者则可通过其高级功能,解决更复杂的场景需求。本文将从基础用法到进阶技巧,结合实际案例,全面解析 PHP glob() 函数的核心价值。


函数基础:glob() 是什么?

1. 功能定位

glob() 函数是 PHP 内置的 文件路径模式匹配工具,其名称来源于 "global" 的缩写,意为“全局搜索”。它的核心作用是根据指定的路径模式(如 *.jpgimages/*.php),返回匹配到的所有文件或目录路径列表。

形象比喻:

如果将文件系统比作一座迷宫,glob() 函数就像一位导航员,能根据你提供的“地图规则”(路径模式),快速找到所有符合条件的“宝藏”(文件或目录)。

2. 基本语法

array glob ( string $pattern [, int $flags = 0 ] )
  • 参数说明

    • pattern:必填,字符串形式的路径模式,支持通配符(如 *?[ ])。
    • flags:可选,控制匹配行为的标志常量,如是否忽略隐藏文件、仅返回目录等。
  • 返回值
    匹配到的路径数组,若无匹配项则返回空数组。


核心用法:从简单到复杂

1. 基础路径匹配

案例 1:列出当前目录下所有 .php 文件

$files = glob("*.php");
foreach ($files as $file) {
    echo "文件名:$file\n";
}

输出示例

文件名:index.php
文件名:functions.php

关键点

  • 通配符 * 表示任意字符序列,因此 *.php 匹配所有以 .php 结尾的文件。

案例 2:递归查找子目录

$files = glob("uploads/*/*", GLOB_BRACE);
foreach ($files as $file) {
    echo "路径:$file\n";
}

注意

  • 默认情况下,glob() 不会递归子目录。若需多级路径匹配,需明确指定层级(如 */*)。
  • GLOB_BRACE 标志允许使用 {} 包裹多个模式(如 {*.jpg,*.png})。

2. 通配符的进阶用法

2.1 精确匹配与模糊匹配

  • 精确匹配:使用 ? 匹配单个字符。
    // 匹配 "file1.txt" 但不匹配 "file12.txt"
    $files = glob("file?.txt");  
    
  • 范围匹配:用 [ ] 定义字符范围。
    // 匹配 "a1.txt"、"b1.txt",但不匹配 "c1.txt"
    $files = glob("[ab]1.txt");  
    

2.2 多模式组合

通过 {} 符号可一次匹配多个模式:

// 匹配所有 .jpg 或 .png 文件
$images = glob("{*.jpg,*.png}", GLOB_BRACE);  

进阶技巧:利用标志常量优化匹配

glob() 的第二个参数 flags 是其强大功能的核心。通过组合标志常量,可以实现以下效果:

1. 常见标志常量

标志常量作用描述
GLOB_ONLYDIR仅匹配目录,忽略文件
GLOB_NOSORT不对结果排序(默认按字母排序)
GLOB_NOCHECK若无匹配项,返回原模式而非空数组
GLOB_BRACE启用 {} 符号的多模式匹配
GLOB_MARK在匹配项后添加斜杠 /(仅对目录生效)
GLOB_NOESCAPE禁用反斜杠 \ 的转义功能

表格说明

  • 上表总结了常用标志及其功能,开发者可根据需求组合使用。例如,GLOB_ONLYDIR | GLOB_NOSORT 可快速获取未排序的目录列表。

2. 实战案例:过滤隐藏文件

在 Linux 系统中,隐藏文件以 . 开头。若需排除这些文件,可结合 GLOB_NOSORT 和模式 [^.]*

// 获取当前目录下非隐藏文件
$files = glob("[^.]*", GLOB_NOSORT);  

原理

  • [!.]* 表示以非 . 开头的任意字符序列,从而排除隐藏文件。
  • GLOB_NOSORT 保留原始顺序,避免额外排序开销。

结合其他函数的高级应用

1. 与 scandir() 的对比

虽然 scandir() 可遍历目录,但 glob() 更适合模式匹配:

// scandir() 需手动过滤文件
$files = array_filter(scandir("images"), function($file) {
    return preg_match("/\.jpg$/i", $file);
});

// glob() 直接匹配模式
$files = glob("images/*.jpg");  

优势glob() 的模式语法更简洁,且无需额外的正则表达式或循环。


2. 动态路径构建与条件判断

在循环或条件逻辑中,glob() 可动态生成路径模式:

// 根据用户输入筛选文件
$extension = $_GET['ext'] ?? 'php';
$files = glob("*.{$extension}");  

注意:需对用户输入进行验证,防止路径遍历漏洞(如 ../)。


常见问题与解决方案

1. 为什么返回空数组?

可能原因:

  • 路径错误或权限不足;
  • 模式中未正确使用通配符;
  • 需要添加 GLOB_NOCHECK 标志。

调试建议

$files = glob("path/to/*.txt", GLOB_NOCHECK);  
if (empty($files)) {
    echo "未找到匹配文件";
} else {
    print_r($files);
}  

2. 如何处理跨平台路径分隔符?

使用 DIRECTORY_SEPARATOR 常量适配不同系统:

$pattern = "dir1" . DIRECTORY_SEPARATOR . "*.php";  
$files = glob($pattern);  

结论

PHP glob() 函数凭借其简洁的语法和灵活的模式匹配能力,成为处理文件系统任务的利器。无论是快速遍历目录、筛选特定格式的文件,还是结合标志常量优化性能,开发者都能通过它显著减少代码量并提升效率。

对于初学者,建议从基础语法开始,逐步尝试通配符和标志常量的组合;中级开发者则可探索其在动态路径、安全验证等场景中的高级应用。掌握 glob() 函数,不仅能解决常见问题,更能为构建更健壮的文件处理逻辑打下坚实基础。


通过本文的解析,希望读者能对 PHP glob() 函数有全面的理解,并在实际项目中灵活运用这一工具,让文件操作变得更简单高效。

最新发布