JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbrtest($line)) { return $reader; } } throw ReaderException::readerNotFound($line); } private static function getReaders(): array { if (static::$readers) { return static::$readers; } static::$readers[] = new ApacheCommonLogFormatReader(); return static::$readers; } public function test(string $line): bool { $matches = $this->match($line); return isset($matches['userAgentString']); } public function read(string $line): string { $matches = $this->match($line); if (!isset($matches['userAgentString'])) { throw ReaderException::userAgentParserError($line); } return $matches['userAgentString']; } protected function match(string $line): array { if (preg_match($this->getRegex(), $line, $matches)) { return $matches; } return []; } abstract protected function getRegex(); }