PHP | glob 函數

怎樣獲取目錄下的文件名稱

最近更新時間 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
rss_feed