*/ private array $cases ) {} /** * @param list $tokens * @return array */ public function matching(array $tokens): array { $matches = []; foreach ($this->cases as $name => $value) { if ($this->matches($name, $tokens)) { $matches[$name] = $value; } } return $matches; } /** * @param list $tokens */ private function matches(string $name, array $tokens): bool { $offset = 0; while (($token = current($tokens)) !== false) { $next = next($tokens); if ($token === '') { if ($next === false) { return true; } continue; } $position = strpos($name, $token, $offset); if ($position === false) { return false; } $offset = $position + strlen($token); } return $offset === strlen($name); } }