1*d5ef99ddSAndreas Gohr<?php 2*d5ef99ddSAndreas Gohr 3*d5ef99ddSAndreas Gohr/** 4*d5ef99ddSAndreas Gohr * Device Detector - The Universal Device Detection library for parsing User Agents 5*d5ef99ddSAndreas Gohr * 6*d5ef99ddSAndreas Gohr * @link https://matomo.org 7*d5ef99ddSAndreas Gohr * 8*d5ef99ddSAndreas Gohr * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later 9*d5ef99ddSAndreas Gohr */ 10*d5ef99ddSAndreas Gohr 11*d5ef99ddSAndreas Gohrdeclare(strict_types=1); 12*d5ef99ddSAndreas Gohr 13*d5ef99ddSAndreas Gohrnamespace DeviceDetector\Parser\Client\Browser; 14*d5ef99ddSAndreas Gohr 15*d5ef99ddSAndreas Gohruse DeviceDetector\Parser\Client\AbstractClientParser; 16*d5ef99ddSAndreas Gohr 17*d5ef99ddSAndreas Gohr/** 18*d5ef99ddSAndreas Gohr * Class Engine 19*d5ef99ddSAndreas Gohr * 20*d5ef99ddSAndreas Gohr * Client parser for browser engine detection 21*d5ef99ddSAndreas Gohr */ 22*d5ef99ddSAndreas Gohrclass Engine extends AbstractClientParser 23*d5ef99ddSAndreas Gohr{ 24*d5ef99ddSAndreas Gohr /** 25*d5ef99ddSAndreas Gohr * @var string 26*d5ef99ddSAndreas Gohr */ 27*d5ef99ddSAndreas Gohr protected $fixtureFile = 'regexes/client/browser_engine.yml'; 28*d5ef99ddSAndreas Gohr 29*d5ef99ddSAndreas Gohr /** 30*d5ef99ddSAndreas Gohr * @var string 31*d5ef99ddSAndreas Gohr */ 32*d5ef99ddSAndreas Gohr protected $parserName = 'browserengine'; 33*d5ef99ddSAndreas Gohr 34*d5ef99ddSAndreas Gohr /** 35*d5ef99ddSAndreas Gohr * Known browser engines mapped to their internal short codes 36*d5ef99ddSAndreas Gohr * 37*d5ef99ddSAndreas Gohr * @var array 38*d5ef99ddSAndreas Gohr */ 39*d5ef99ddSAndreas Gohr protected static $availableEngines = [ 40*d5ef99ddSAndreas Gohr 'WebKit', 41*d5ef99ddSAndreas Gohr 'Blink', 42*d5ef99ddSAndreas Gohr 'Trident', 43*d5ef99ddSAndreas Gohr 'Text-based', 44*d5ef99ddSAndreas Gohr 'Dillo', 45*d5ef99ddSAndreas Gohr 'iCab', 46*d5ef99ddSAndreas Gohr 'Elektra', 47*d5ef99ddSAndreas Gohr 'Presto', 48*d5ef99ddSAndreas Gohr 'Clecko', 49*d5ef99ddSAndreas Gohr 'Gecko', 50*d5ef99ddSAndreas Gohr 'KHTML', 51*d5ef99ddSAndreas Gohr 'NetFront', 52*d5ef99ddSAndreas Gohr 'Edge', 53*d5ef99ddSAndreas Gohr 'NetSurf', 54*d5ef99ddSAndreas Gohr 'Servo', 55*d5ef99ddSAndreas Gohr 'Goanna', 56*d5ef99ddSAndreas Gohr 'EkiohFlow', 57*d5ef99ddSAndreas Gohr 'Arachne', 58*d5ef99ddSAndreas Gohr 'LibWeb', 59*d5ef99ddSAndreas Gohr 'Maple', 60*d5ef99ddSAndreas Gohr ]; 61*d5ef99ddSAndreas Gohr 62*d5ef99ddSAndreas Gohr /** 63*d5ef99ddSAndreas Gohr * Returns list of all available browser engines 64*d5ef99ddSAndreas Gohr * @return array 65*d5ef99ddSAndreas Gohr */ 66*d5ef99ddSAndreas Gohr public static function getAvailableEngines(): array 67*d5ef99ddSAndreas Gohr { 68*d5ef99ddSAndreas Gohr return self::$availableEngines; 69*d5ef99ddSAndreas Gohr } 70*d5ef99ddSAndreas Gohr 71*d5ef99ddSAndreas Gohr /** 72*d5ef99ddSAndreas Gohr * @inheritdoc 73*d5ef99ddSAndreas Gohr */ 74*d5ef99ddSAndreas Gohr public function parse(): ?array 75*d5ef99ddSAndreas Gohr { 76*d5ef99ddSAndreas Gohr $matches = false; 77*d5ef99ddSAndreas Gohr 78*d5ef99ddSAndreas Gohr foreach ($this->getRegexes() as $regex) { 79*d5ef99ddSAndreas Gohr $matches = $this->matchUserAgent($regex['regex']); 80*d5ef99ddSAndreas Gohr 81*d5ef99ddSAndreas Gohr if ($matches) { 82*d5ef99ddSAndreas Gohr break; 83*d5ef99ddSAndreas Gohr } 84*d5ef99ddSAndreas Gohr } 85*d5ef99ddSAndreas Gohr 86*d5ef99ddSAndreas Gohr if (empty($matches) || empty($regex)) { 87*d5ef99ddSAndreas Gohr return null; 88*d5ef99ddSAndreas Gohr } 89*d5ef99ddSAndreas Gohr 90*d5ef99ddSAndreas Gohr $name = $this->buildByMatch($regex['name'], $matches); 91*d5ef99ddSAndreas Gohr 92*d5ef99ddSAndreas Gohr foreach (self::getAvailableEngines() as $engineName) { 93*d5ef99ddSAndreas Gohr if (\strtolower($name) === \strtolower($engineName)) { 94*d5ef99ddSAndreas Gohr return ['engine' => $engineName]; 95*d5ef99ddSAndreas Gohr } 96*d5ef99ddSAndreas Gohr } 97*d5ef99ddSAndreas Gohr 98*d5ef99ddSAndreas Gohr // This Exception should never be thrown. If so a defined browser name is missing in $availableEngines 99*d5ef99ddSAndreas Gohr throw new \Exception(\sprintf( 100*d5ef99ddSAndreas Gohr 'Detected browser engine was not found in $availableEngines. Tried to parse user agent: %s', 101*d5ef99ddSAndreas Gohr $this->userAgent 102*d5ef99ddSAndreas Gohr )); // @codeCoverageIgnore 103*d5ef99ddSAndreas Gohr } 104*d5ef99ddSAndreas Gohr} 105