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