independent-analytics
/
vendor
/
matomo
/
device-detector
/
Parser
/
Client
/
Browser
/
Engine
/
Version.php
independent-analytics
/
vendor
/
matomo
/
device-detector
/
Parser
/
Client
/
Browser
/
Engine
Last commit date
Version.php
4 months ago
Version.php
68 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * Device Detector - The Universal Device Detection library for parsing User Agents |
| 5 | * |
| 6 | * @link https://matomo.org |
| 7 | * |
| 8 | * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later |
| 9 | */ |
| 10 | declare (strict_types=1); |
| 11 | namespace IAWPSCOPED\DeviceDetector\Parser\Client\Browser\Engine; |
| 12 | |
| 13 | use IAWPSCOPED\DeviceDetector\Parser\Client\AbstractClientParser; |
| 14 | /** |
| 15 | * Class Version |
| 16 | * |
| 17 | * Client parser for browser engine version detection |
| 18 | * @internal |
| 19 | */ |
| 20 | class Version extends AbstractClientParser |
| 21 | { |
| 22 | /** |
| 23 | * @var string |
| 24 | */ |
| 25 | private $engine; |
| 26 | /** |
| 27 | * Version constructor. |
| 28 | * |
| 29 | * @param string $ua |
| 30 | * @param string $engine |
| 31 | */ |
| 32 | public function __construct(string $ua, string $engine) |
| 33 | { |
| 34 | parent::__construct($ua); |
| 35 | $this->engine = $engine; |
| 36 | } |
| 37 | /** |
| 38 | * @inheritdoc |
| 39 | */ |
| 40 | public function parse() : ?array |
| 41 | { |
| 42 | if (empty($this->engine)) { |
| 43 | return null; |
| 44 | } |
| 45 | if ('Gecko' === $this->engine || 'Clecko' === $this->engine) { |
| 46 | $pattern = '~[ ](?:rv[: ]([0-9.]+)).*(?:g|cl)ecko/\\d{8,10}~i'; |
| 47 | if (\preg_match($pattern, $this->userAgent, $matches)) { |
| 48 | return ['version' => \array_pop($matches)]; |
| 49 | } |
| 50 | } |
| 51 | $engineToken = $this->engine; |
| 52 | if ('Blink' === $this->engine) { |
| 53 | $engineToken = 'Chr[o0]me|Chromium|Cronet'; |
| 54 | } |
| 55 | if ('Arachne' === $this->engine) { |
| 56 | $engineToken = 'Arachne\\/5\\.'; |
| 57 | } |
| 58 | if ('LibWeb' === $this->engine) { |
| 59 | $engineToken = 'LibWeb\\+LibJs'; |
| 60 | } |
| 61 | \preg_match("~(?:{$engineToken})\\s*[/_]?\\s*((?(?=\\d+\\.\\d)\\d+[.\\d]*|\\d{1,7}(?=(?:\\D|\$))))~i", $this->userAgent, $matches); |
| 62 | if (!$matches) { |
| 63 | return null; |
| 64 | } |
| 65 | return ['version' => \array_pop($matches)]; |
| 66 | } |
| 67 | } |
| 68 |