You are here

protected static function Glob::fallbackGlob in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/zendframework/zend-stdlib/src/Glob.php \Zend\Stdlib\Glob::fallbackGlob()

Expand braces manually, then use the system glob.

Parameters

string $pattern:

int $flags:

Return value

array

Throws

Exception\RuntimeException

1 call to Glob::fallbackGlob()
Glob::glob in vendor/zendframework/zend-stdlib/src/Glob.php
Find pathnames matching a pattern.

File

vendor/zendframework/zend-stdlib/src/Glob.php, line 97

Class

Glob
Wrapper for glob with fallback if GLOB_BRACE is not available.

Namespace

Zend\Stdlib

Code

protected static function fallbackGlob($pattern, $flags) {
  if (!$flags & self::GLOB_BRACE) {
    return static::systemGlob($pattern, $flags);
  }
  $flags &= ~self::GLOB_BRACE;
  $length = strlen($pattern);
  $paths = [];
  if ($flags & self::GLOB_NOESCAPE) {
    $begin = strpos($pattern, '{');
  }
  else {
    $begin = 0;
    while (true) {
      if ($begin === $length) {
        $begin = false;
        break;
      }
      elseif ($pattern[$begin] === '\\' && $begin + 1 < $length) {
        $begin++;
      }
      elseif ($pattern[$begin] === '{') {
        break;
      }
      $begin++;
    }
  }
  if ($begin === false) {
    return static::systemGlob($pattern, $flags);
  }
  $next = static::nextBraceSub($pattern, $begin + 1, $flags);
  if ($next === null) {
    return static::systemGlob($pattern, $flags);
  }
  $rest = $next;
  while ($pattern[$rest] !== '}') {
    $rest = static::nextBraceSub($pattern, $rest + 1, $flags);
    if ($rest === null) {
      return static::systemGlob($pattern, $flags);
    }
  }
  $p = $begin + 1;
  while (true) {
    $subPattern = substr($pattern, 0, $begin) . substr($pattern, $p, $next - $p) . substr($pattern, $rest + 1);
    $result = static::fallbackGlob($subPattern, $flags | self::GLOB_BRACE);
    if ($result) {
      $paths = array_merge($paths, $result);
    }
    if ($pattern[$next] === '}') {
      break;
    }
    $p = $next + 1;
    $next = static::nextBraceSub($pattern, $p, $flags);
  }
  return array_unique($paths);
}