DeviceDetector::regex()   B
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 256
Code Lines 187

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 187
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 256
rs 8

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * Platine User Agent
5
 *
6
 * Platine User Agent is a lightweight library for detecting
7
 * user browser, device, OS, CPU
8
 *
9
 * This content is released under the MIT License (MIT)
10
 *
11
 * Copyright (c) 2020 Platine User Agent
12
 *
13
 * Permission is hereby granted, free of charge, to any person obtaining a copy
14
 * of this software and associated documentation files (the "Software"), to deal
15
 * in the Software without restriction, including without limitation the rights
16
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
 * copies of the Software, and to permit persons to whom the Software is
18
 * furnished to do so, subject to the following conditions:
19
 *
20
 * The above copyright notice and this permission notice shall be included in all
21
 * copies or substantial portions of the Software.
22
 *
23
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
 * SOFTWARE.
30
 */
31
32
/**
33
 *  @file DeviceDetector.php
34
 *
35
 *  The device detector class
36
 *
37
 *  @package    Platine\UserAgent\Detector
38
 *  @author Platine Developers Team
39
 *  @copyright  Copyright (c) 2020
40
 *  @license    http://opensource.org/licenses/MIT  MIT License
41
 *  @link   https://www.platine-php.com
42
 *  @version 1.0.0
43
 *  @filesource
44
 */
45
46
declare(strict_types=1);
47
48
namespace Platine\UserAgent\Detector;
49
50
use Platine\UserAgent\Entity\Device;
51
52
/**
53
 * @class DeviceDetector
54
 * @package Platine\UserAgent\Detector
55
 */
56
class DeviceDetector extends AbstractDetector
57
{
58
     /**
59
     * {@inheritdoc}
60
     */
61
    public function __construct()
62
    {
63
        parent::__construct();
64
65
        $this->entity = new Device();
66
    }
67
68
    /**
69
     * {@inheritdoc}
70
     */
71
    public function maps(): array
72
    {
73
        return [
74
            'amazon' => [
75
                'model' => [
76
                    'Fire Phone' => ['SD', 'KF']
77
                ]
78
            ],
79
            'sprint' => [
80
                'model' => [
81
                    'Evo Shift 4G' => '7373KT'
82
                ],
83
                'vendor' => [
84
                    'HTC' => 'APA',
85
                    'Sprint' => 'Sprint'
86
                ]
87
            ]
88
        ];
89
    }
90
91
    /**
92
     * {@inheritdoc}
93
     */
94
    public function regex(): array
95
    {
96
        return [
97
            [
98
99
                '/\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i'                        // iPad/PlayBook
100
            ], [self::MODEL, self::VENDOR, [self::TYPE, self::TABLET]], [
101
102
                '/applecoremedia\/[\w\.]+ \((ipad)/'                                  // iPad
103
            ], [self::MODEL, [self::VENDOR, 'Apple'], [self::TYPE, self::TABLET]], [
104
105
                '/(apple\s{0,1}tv)/i'                                                 // Apple TV
106
            ], [[self::MODEL, 'Apple TV'], [self::VENDOR, 'Apple']], [
107
108
                '/(archos)\s(gamepad2?)/i',                                           // Archos
109
                '/(hp).+(touchpad)/i',                                                // HP TouchPad
110
                '/(hp).+(tablet)/i',                                                  // HP Tablet
111
                '/(kindle)\/([\w\.]+)/i',                                             // Kindle
112
                '/\s(nook)[\w\s]+build\/(\w+)/i',                                     // Nook
113
                '/(dell)\s(strea[kpr\s\d]*[\dko])/i'                                  // Dell Streak
114
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
115
116
                '/(kf[A-z]+)\sbuild\/.+silk\//i'                                      // Kindle Fire HD
117
            ], [self::MODEL, [self::VENDOR, 'Amazon'], [self::TYPE, self::TABLET]], [
118
                '/(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i'                         // Fire Phone
119
            ], [[self::MODEL, '__str', 'amazon.model'], [self::VENDOR, 'Amazon'], [self::TYPE, self::MOBILE]], [
120
                '/android.+aft([bms])\sbuild/i'                                       // Fire TV
121
            ], [self::MODEL, [self::VENDOR, 'Amazon'], [self::TYPE, self::SMART_TV]], [
122
123
                '/\((ip[honed|\s\w*]+);.+(apple)/i'                                   // iPod/iPhone
124
            ], [self::MODEL, self::VENDOR, [self::TYPE, self::MOBILE]], [
125
                '/\((ip[honed|\s\w*]+);/i'                                            // iPod/iPhone
126
            ], [self::MODEL, [self::VENDOR, 'Apple'], [self::TYPE, self::MOBILE]], [
127
128
                '/(blackberry)[\s-]?(\w+)/i',                                         // BlackBerry
129
                '/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i',
130
                // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
131
                '/(hp)\s([\w\s]+\w)/i',                                               // HP iPAQ
132
                '/(asus)-?(\w+)/i'                                                    // Asus
133
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
134
                '/\(bb10;\s(\w+)/i'                                                   // BlackBerry 10
135
            ], [self::MODEL, [self::VENDOR, 'BlackBerry'], [self::TYPE, self::MOBILE]], [
136
                // Asus Tablets
137
                '/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i'
138
            ], [self::MODEL, [self::VENDOR, 'Asus'], [self::TYPE, self::TABLET]], [
139
140
                '/(sony)\s(tablet\s[ps])\sbuild\//i',                                  // Sony
141
                '/(sony)?(?:sgp.+)\sbuild\//i'
142
            ], [[self::VENDOR, 'Sony'], [self::MODEL, 'Xperia Tablet'], [self::TYPE, self::TABLET]], [
143
                '/android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i'
144
            ], [self::MODEL, [self::VENDOR, 'Sony'], [self::TYPE, self::MOBILE]], [
145
146
                '/\s(ouya)\s/i',                                                      // Ouya
147
                '/(nintendo)\s([wids3u]+)/i'                                          // Nintendo
148
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::CONSOLE]], [
149
150
                '/android.+;\s(shield)\sbuild/i'                                      // Nvidia
151
            ], [self::MODEL, [self::VENDOR, 'Nvidia'], [self::TYPE, self::CONSOLE]], [
152
153
                '/(playstation\s[34portablevi]+)/i'                                   // Playstation
154
            ], [self::MODEL, [self::VENDOR, 'Sony'], [self::TYPE, self::CONSOLE]], [
155
156
                '/(sprint\s(\w+))/i'                                                  // Sprint Phones
157
            ], [[self::VENDOR, '__str', 'sprint.vendor'], [self::MODEL, '__str', 'sprint.model'], [self::TYPE, self::MOBILE]], [
158
159
                '/(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i',                        // HTC
160
                '/(zte)-(\w*)/i',                                                     // ZTE
161
                '/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i'
162
                // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
163
            ], [self::VENDOR, [self::MODEL, '/_/', ' '], [self::TYPE, self::MOBILE]], [
164
165
                '/(nexus\s9)/i'                                                       // HTC Nexus 9
166
            ], [self::MODEL, [self::VENDOR, 'HTC'], [self::TYPE, self::TABLET]], [
167
168
                '/d\/huawei([\w\s-]+)[;\)]/i',
169
                '/(nexus\s6p)/i'                                                      // Huawei
170
            ], [self::MODEL, [self::VENDOR, 'Huawei'], [self::TYPE, self::MOBILE]], [
171
172
                '/(microsoft);\s(lumia[\s\w]+)/i'                                     // Microsoft Lumia
173
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
174
175
                '/[\s\(;](xbox(?:\sone)?)[\s\);]/i'                                   // Microsoft Xbox
176
            ], [self::MODEL, [self::VENDOR, 'Microsoft'], [self::TYPE, self::CONSOLE]], [
177
                '/(kin\.[onetw]{3})/i'                                                // Microsoft Kin
178
            ], [[self::MODEL, '/\./', ' '], [self::VENDOR, 'Microsoft'], [self::TYPE, self::MOBILE]], [
179
180
                // Motorola
181
                '/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i',
182
                '/mot[\s-]?(\w*)/i',
183
                '/(XT\d{3,4}) build\//i',
184
                '/(nexus\s6)/i'
185
            ], [self::MODEL, [self::VENDOR, 'Motorola'], [self::TYPE, self::MOBILE]], [
186
                '/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i'
187
            ], [self::MODEL, [self::VENDOR, 'Motorola'], [self::TYPE, self::TABLET]], [
188
189
                '/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i'            // HbbTV devices
190
            ], [[self::VENDOR, '__trim'], [self::MODEL, '__trim'], [self::TYPE, self::SMART_TV]], [
191
192
                '/hbbtv.+maple;(\d+)/i'
193
            ], [[self::MODEL, '/^/', 'SMART_TV'], [self::VENDOR, 'Samsung'], [self::TYPE, self::SMART_TV]], [
194
195
                '/\(dtv[\);].+(aquos)/i'                                              // Sharp
196
            ], [self::MODEL, [self::VENDOR, 'Sharp'], [self::TYPE, self::SMART_TV]], [
197
198
                '/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i',
199
                '/((SM-T\w+))/i'
200
            ], [[self::VENDOR, 'Samsung'], self::MODEL, [self::TYPE, self::TABLET]], [                  // Samsung
201
                '/smart-tv.+(samsung)/i'
202
            ], [self::VENDOR, [self::TYPE, self::SMART_TV], self::MODEL], [
203
                '/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i',
204
                '/(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i',
205
                '/sec-((sgh\w+))/i'
206
            ], [[self::VENDOR, 'Samsung'], self::MODEL, [self::TYPE, self::MOBILE]], [
207
208
                '/sie-(\w*)/i'                                                        // Siemens
209
            ], [self::MODEL, [self::VENDOR, 'Siemens'], [self::TYPE, self::MOBILE]], [
210
211
                '/(maemo|nokia).*(n900|lumia\s\d+)/i',                                // Nokia
212
                '/(nokia)[\s_-]?([\w-]*)/i'
213
            ], [[self::VENDOR, 'Nokia'], self::MODEL, [self::TYPE, self::MOBILE]], [
214
215
                '/android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i'                   // Acer
216
            ], [self::MODEL, [self::VENDOR, 'Acer'], [self::TYPE, self::TABLET]], [
217
218
                '/android.+([vl]k\-?\d{3})\s+build/i'                                 // LG Tablet
219
            ], [self::MODEL, [self::VENDOR, 'LG'], [self::TYPE, self::TABLET]], [
220
                '/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i'                     // LG Tablet
221
            ], [[self::VENDOR, 'LG'], self::MODEL, [self::TYPE, self::TABLET]], [
222
                '/(lg) netcast\.tv/i'                                                 // LG SMART_TV
223
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::SMART_TV]], [
224
                '/(nexus\s[45])/i',                                                   // LG
225
                '/lg[e;\s\/-]+(\w*)/i',
226
                '/android.+lg(\-?[\d\w]+)\s+build/i'
227
            ], [self::MODEL, [self::VENDOR, 'LG'], [self::TYPE, self::MOBILE]], [
228
229
                '/(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i'             // Lenovo tablets
230
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
231
                '/android.+(ideatab[a-z0-9\-\s]+)/i'                                  // Lenovo
232
            ], [self::MODEL, [self::VENDOR, 'Lenovo'], [self::TYPE, self::TABLET]], [
233
                '/(lenovo)[_\s-]?([\w-]+)/i'
234
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
235
236
                '/linux;.+((jolla));/i'                                               // Jolla
237
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
238
239
                '/((pebble))app\/[\d\.]+\s/i'                                         // Pebble
240
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::WEARABLE]], [
241
242
                '/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i'                            // OPPO
243
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::MOBILE]], [
244
245
                '/crkey/i'                                                            // Google Chromecast
246
            ], [[self::MODEL, 'Chromecast'], [self::VENDOR, 'Google']], [
247
248
                '/android.+;\s(glass)\s\d/i'                                          // Google Glass
249
            ], [self::MODEL, [self::VENDOR, 'Google'], [self::TYPE, self::WEARABLE]], [
250
251
                '/android.+;\s(pixel c)[\s)]/i'                                       // Google Pixel C
252
            ], [self::MODEL, [self::VENDOR, 'Google'], [self::TYPE, self::TABLET]], [
253
254
                '/android.+;\s(pixel( [23])?( xl)?)[\s)]/i'                              // Google Pixel
255
            ], [self::MODEL, [self::VENDOR, 'Google'], [self::TYPE, self::MOBILE]], [
256
257
                '/android.+;\s(\w+)\s+build\/hm\1/i',                                 // Xiaomi Hongmi 'numeric' models
258
                '/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i',               // Xiaomi Hongmi
259
                '/android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i',
260
                // Xiaomi Mi
261
                '/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i'       // Redmi Phones
262
            ], [[self::MODEL, '/_/', ' '], [self::VENDOR, 'Xiaomi'], [self::TYPE, self::MOBILE]], [
263
                '/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i'            // Mi Pad tablets
264
            ], [[self::MODEL, '/_/', ' '], [self::VENDOR, 'Xiaomi'], [self::TYPE, self::TABLET]], [
265
                '/android.+;\s(m[1-5]\snote)\sbuild/i'                                // Meizu
266
            ], [self::MODEL, [self::VENDOR, 'Meizu'], [self::TYPE, self::MOBILE]], [
267
                '/(mz)-([\w-]{2,})/i'
268
            ], [[self::VENDOR, 'Meizu'], self::MODEL, [self::TYPE, self::MOBILE]], [
269
270
                '/android.+a000(1)\s+build/i',                                        // OnePlus
271
                '/android.+oneplus\s(a\d{4})\s+build/i'
272
            ], [self::MODEL, [self::VENDOR, 'OnePlus'], [self::TYPE, self::MOBILE]], [
273
274
                '/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i'                            // RCA Tablets
275
            ], [self::MODEL, [self::VENDOR, 'RCA'], [self::TYPE, self::TABLET]], [
276
277
                '/android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i'                      // Dell Venue Tablets
278
            ], [self::MODEL, [self::VENDOR, 'Dell'], [self::TYPE, self::TABLET]], [
279
280
                '/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i'                         // Verizon Tablet
281
            ], [self::MODEL, [self::VENDOR, 'Verizon'], [self::TYPE, self::TABLET]], [
282
283
                '/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i'     // Barnes & Noble Tablet
284
            ], [[self::VENDOR, 'Barnes & Noble'], self::MODEL, [self::TYPE, self::TABLET]], [
285
286
                '/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i'                           // Barnes & Noble Tablet
287
            ], [self::MODEL, [self::VENDOR, 'NuVision'], [self::TYPE, self::TABLET]], [
288
289
                '/android.+;\s(k88)\sbuild/i'                                         // ZTE K Series Tablet
290
            ], [self::MODEL, [self::VENDOR, 'ZTE'], [self::TYPE, self::TABLET]], [
291
292
                '/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i'                         // Swiss GEN Mobile
293
            ], [self::MODEL, [self::VENDOR, 'Swiss'], [self::TYPE, self::MOBILE]], [
294
295
                '/android.+[;\/]\s*(zur\d{3})\s+build/i'                              // Swiss ZUR Tablet
296
            ], [self::MODEL, [self::VENDOR, 'Swiss'], [self::TYPE, self::TABLET]], [
297
298
                '/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i'                         // Zeki Tablets
299
            ], [self::MODEL, [self::VENDOR, 'Zeki'], [self::TYPE, self::TABLET]], [
300
301
                '/(android).+[;\/]\s+([YR]\d{2})\s+build/i',
302
                '/android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i'        // Dragon Touch Tablet
303
            ], [[self::VENDOR, 'Dragon Touch'], self::MODEL, [self::TYPE, self::TABLET]], [
304
305
                '/android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i'                            // Insignia Tablets
306
            ], [self::MODEL, [self::VENDOR, 'Insignia'], [self::TYPE, self::TABLET]], [
307
308
                '/android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i'                    // NextBook Tablets
309
            ], [self::MODEL, [self::VENDOR, 'NextBook'], [self::TYPE, self::TABLET]], [
310
311
                '/android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i'
312
            ], [[self::VENDOR, 'Voice'], self::MODEL, [self::TYPE, self::MOBILE]], [                    // Voice Xtreme Phones
313
314
                '/android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i'                     // LvTel Phones
315
            ], [[self::VENDOR, 'LvTel'], self::MODEL, [self::TYPE, self::MOBILE]], [
316
317
                '/android.+;\s(PH-1)\s/i'
318
            ], [self::MODEL, [self::VENDOR, 'Essential'], [self::TYPE, self::MOBILE]], [                // Essential PH-1
319
320
                '/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i'          // Envizen Tablets
321
            ], [self::MODEL, [self::VENDOR, 'Envizen'], [self::TYPE, self::TABLET]], [
322
323
                '/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i'          // Le Pan Tablets
324
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
325
326
                '/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i'                         // MachSpeed Tablets
327
            ], [self::MODEL, [self::VENDOR, 'MachSpeed'], [self::TYPE, self::TABLET]], [
328
329
                '/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i'                // Trinity Tablets
330
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
331
332
                '/android.+[;\/]\s*TU_(1491)\s+build/i'                               // Rotor Tablets
333
            ], [self::MODEL, [self::VENDOR, 'Rotor'], [self::TYPE, self::TABLET]], [
334
335
                '/android.+(KS(.+))\s+build/i'                                        // Amazon Kindle Tablets
336
            ], [self::MODEL, [self::VENDOR, 'Amazon'], [self::TYPE, self::TABLET]], [
337
338
                '/android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i'                      // Gigaset Tablets
339
            ], [self::VENDOR, self::MODEL, [self::TYPE, self::TABLET]], [
340
341
                '/\s(tablet|tab)[;\/]/i',                                             // Unidentifiable Tablet
342
                '/\s(mobile)(?:[;\/]|\ssafari)/i'                                     // Unidentifiable Mobile
343
            ], [[self::TYPE, '__lowerize'], self::VENDOR, self::MODEL], [
344
345
                '/[\s\/\(](smart-?tv)[;\)]/i'                                         // SMART_TV
346
            ], [[self::TYPE, self::SMART_TV]], [
347
348
                '/(android[\w\.\s\-]{0,9});.+build/i'                                 // Generic Android Device
349
            ], [self::MODEL, [self::VENDOR, 'Generic']]
350
        ];
351
    }
352
}
353