WP_CLI\Utils
glob_brace()
Simulate a glob() with the GLOB_BRACE flag set. For systems (eg Alpine Linux) built against a libc library (eg https://www.musl-libc.org/) that lacks it. Copied and adapted from Zend Framework's Glob::fallbackGlob() and Glob::nextBraceSub()`.
Zend Framework (https://framework.zend.com/)
No Hooks.
Returns
Array
Usage
glob_brace( $pattern, $dummy_flags );
- $pattern(string) (required)
- Filename pattern.
- $dummy_flags(void)
- Not used.
Default:null
glob_brace() glob brace code WP-CLI 2.13.0-alpha
function glob_brace( $pattern, $dummy_flags = null ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- $dummy_flags is needed for compatibility with the libc implementation.
static $next_brace_sub;
if ( ! $next_brace_sub ) {
// Find the end of the subpattern in a brace expression.
$next_brace_sub = function ( $pattern, $current ) {
$length = strlen( $pattern );
$depth = 0;
while ( $current < $length ) {
if ( '\\' === $pattern[ $current ] ) {
if ( ++$current === $length ) {
break;
}
++$current;
} else {
if ( ( '}' === $pattern[ $current ] && 0 === $depth-- ) || ( ',' === $pattern[ $current ] && 0 === $depth ) ) {
break;
}
if ( '{' === $pattern[ $current++ ] ) {
++$depth;
}
}
}
return $current < $length ? $current : null;
};
}
$length = strlen( $pattern );
// Find first opening brace.
for ( $begin = 0; $begin < $length; $begin++ ) {
if ( '\\' === $pattern[ $begin ] ) {
++$begin;
} elseif ( '{' === $pattern[ $begin ] ) {
break;
}
}
// Find comma or matching closing brace.
$next = $next_brace_sub( $pattern, $begin + 1 );
if ( null === $next ) {
return glob( $pattern );
}
$rest = $next;
// Point `$rest` to matching closing brace.
while ( '}' !== $pattern[ $rest ] ) {
$rest = $next_brace_sub( $pattern, $rest + 1 );
if ( null === $rest ) {
return glob( $pattern );
}
}
$paths = [];
$p = $begin + 1;
// For each comma-separated subpattern.
do {
$subpattern = substr( $pattern, 0, $begin )
. substr( $pattern, $p, $next - $p )
. substr( $pattern, $rest + 1 );
$result = glob_brace( $subpattern );
if ( ! empty( $result ) ) {
$paths = array_merge( $paths, $result );
}
if ( '}' === $pattern[ $next ] ) {
break;
}
$p = $next + 1;
$next = $next_brace_sub( $pattern, $p );
} while ( null !== $next );
return array_values( array_unique( $paths ) );
}