private static function parseExcludePattern($pattern) { if (!is_string($pattern)) { throw new \Exception('Exclude/include pattern must be a string.'); } $result = ['pattern' => $pattern, 'flags' => 0, 'firstWildcard' => false]; if (!isset($pattern[0])) { return $result; } if ($pattern[0] == '!') { $result['flags'] |= self::PATTERN_NEGATIVE; $pattern = StringHelper::byteSubstr($pattern, 1, StringHelper::byteLength($pattern)); } $len = StringHelper::byteLength($pattern); if ($len && StringHelper::byteSubstr($pattern, -1, 1) == '/') { $pattern = StringHelper::byteSubstr($pattern, 0, -1); $len--; $result['flags'] |= self::PATTERN_MUSTBEDIR; } if (strpos($pattern, '/') === false) { $result['flags'] |= self::PATTERN_NODIR; } $result['firstWildcard'] = self::firstWildcardInPattern($pattern); if ($pattern[0] == '*' && self::firstWildcardInPattern(StringHelper::byteSubstr($pattern, 1, StringHelper::byteLength($pattern))) === false) { $result['flags'] |= self::PATTERN_ENDSWITH; } $result['pattern'] = $pattern; return $result; }