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