此函数支持GLOB_BRACE:
function rglob($pattern_in, $flags = 0) {
$patterns = array ();
if ($flags & GLOB_BRACE) {
$matches;
if (preg_match_all ( '#\{[^.\}]*\}#i', $pattern_in, $matches )) {
// Get all GLOB_BRACE entries.
$brace_entries = array ();
foreach ( $matches [0] as $index => $match ) {
$brace_entries [$index] = explode ( ',', substr ( $match, 1, - 1 ) );
}
// Create cartesian product.
// @source: https://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays
$cart = array (
array ()
);
foreach ( $brace_entries as $key => $values ) {
$append = array ();
foreach ( $cart as $product ) {
foreach ( $values as $item ) {
$product [$key] = $item;
$append [] = $product;
}
}
$cart = $append;
}
// Create multiple glob patterns based on the cartesian product.
foreach ( $cart as $vals ) {
$c_pattern = $pattern_in;
foreach ( $vals as $index => $val ) {
$c_pattern = preg_replace ( '/' . $matches [0] [$index] . '/', $val, $c_pattern, 1 );
}
$patterns [] = $c_pattern;
}
} else
$patterns [] = $pattern_in;
} else
$patterns [] = $pattern_in;
// @source: http://php.net/manual/en/function.glob.php#106595
$result = array ();
foreach ( $patterns as $pattern ) {
$files = glob ( $pattern, $flags );
foreach ( glob ( dirname ( $pattern ) . '/*', GLOB_ONLYDIR | GLOB_NOSORT ) as $dir ) {
$files = array_merge ( $files, rglob ( $dir . '/' . basename ( $pattern ), $flags ) );
}
$result = array_merge ( $result, $files );
}
return $result;
}