PHP | glob 函数

Lasted 2021-01-18 19:50:00

glob 函数寻查找与模式匹配的文件路径。

glob() 函数依照 libc glob() 函数使用的规则寻找所有与 pattern 匹配的文件路径,类似于一般 shells 所用的规则一样。

函数定义

glob ( string $pattern , int $flags = 0 ) : array
// 源文件位于:ext/standard/dir.c
# 函数定义

PHP_FUNCTION(glob)
{
  ...
  if (pattern_len >= MAXPATHLEN) {
    php_error_docref(NULL, E_WARNING, "Pattern exceeds the maximum allowed length of %d characters", MAXPATHLEN);
    RETURN_FALSE;
  }

  if ((GLOB_AVAILABLE_FLAGS & flags) != flags) {
    php_error_docref(NULL, E_WARNING, "At least one of the passed flags is invalid or not supported on this platform");
    RETURN_FALSE;
  }

  array_init(return_value);
  for (n = 0; n < (size_t)globbuf.gl_pathc; n++) {
    if (PG(open_basedir) && *PG(open_basedir)) {
      if (php_check_open_basedir_ex(globbuf.gl_pathv[n], 0)) {
        basedir_limit = 1;
        continue;
      }
    }
    /* we need to do this every time since GLOB_ONLYDIR does not guarantee that
     * all directories will be filtered. GNU libc documentation states the
     * following:
     * If the information about the type of the file is easily available
     * non-directories will be rejected but no extra work will be done to
     * determine the information for each file. I.e., the caller must still be
     * able to filter directories out.
     */
    if (flags & GLOB_ONLYDIR) {
      zend_stat_t s;

      if (0 != VCWD_STAT(globbuf.gl_pathv[n], &s)) {
        continue;
      }

      if (S_IFDIR != (s.st_mode & S_IFMT)) {
        continue;
      }
    }
    add_next_index_string(return_value, globbuf.gl_pathv[n]+cwd_skip);
  }

  globfree(&globbuf);

  if (basedir_limit && !zend_hash_num_elements(Z_ARRVAL_P(return_value))) {
    zend_array_destroy(Z_ARR_P(return_value));
    RETURN_FALSE;
  }
}

参数

  • checkpattern - 匹配模式。特殊字符:
    • * 匹配零个或多个字符。
    • ? 只匹配单个字符(任意字符)。
    • [...] 匹配一组字符中的一个字符。 如果第一个字符是 !,则为否定模式, 即匹配不在这组字符中的任意字符。
  • checkflags - 有效标记有:
    • GLOB_MARK 在每个返回的项目中加一个斜线。
    • GLOB_NOSORT 按照文件在目录中出现的原始顺序返回(不排序)。
    • GLOB_NOCHECK 如果没有文件匹配则返回用于搜索的模式。
    • GLOB_NOESCAPE 反斜线不转义元字符。
    • GLOB_BRACE 扩充 {a,b,c} 来匹配 'a','b' 或 'c'。
    • GLOB_ONLYDIR 仅返回与模式匹配的目录项。
    • GLOB_ERR 停止并读取错误信息(比如说不可读的目录),默认的情况下忽略所有错误。

返回值

  • checkarray - 返回包含有匹配文件和目录的数组,没有匹配文件时返回空数组,失败返回 false。

示例1: - 使用 glob() 函数获取目录下 txt 文件。

<?php
/**
 * PHP glob() 函数获取目录下 txt 文件。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 获取当前目录下 txt 文件
foreach (glob("*.txt") as $fileName) {
  echo "FileName::: ". $fileName.PHP_EOL;
}
FileName::: abc.txt
FileName::: foo.txt
FileName::: test.txt
FileName::: me.txt