PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 3.6.21
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v3.6.21
6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 3.6.65 3.6.66 All 195 releases
fluentform / app / Services / Browser / Browser.php

Browser.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 3.6.21, at app/Services/Browser/Browser.php

1,733 lines 53.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentForm\App\Services\Browser;
4
5 /**
6 * File: Browser.php
7 * Author: Chris Schuld (http://chrisschuld.com/)
8 * Last Modified: July 22nd, 2016
9 * @version 2.0
10 * @package PegasusPHP
11 *
12 * Copyright (C) 2008-2010 Chris Schuld (chris@chrisschuld.com)
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License as
16 * published by the Free Software Foundation; either version 2 of
17 * the License, or (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details at:
23 * http://www.gnu.org/copyleft/gpl.html
24 *
25 *
26 * Typical Usage:
27 *
28 * $browser = new Browser();
29 * if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
30 * echo 'You have FireFox version 2 or greater';
31 * }
32 *
33 * User Agents Sampled from: http://www.useragentstring.com/
34 *
35 * This implementation is based on the original work from Gary White
36 * http://apptools.com/phptools/browser/
37 *
38 */
39 class Browser
40 {
41 private $_agent = '';
42 private $_browser_name = '';
43 private $_version = '';
44 private $_platform = '';
45 private $_os = '';
46 private $_is_aol = false;
47 private $_is_mobile = false;
48 private $_is_tablet = false;
49 private $_is_robot = false;
50 private $_is_facebook = false;
51 private $_aol_version = '';
52
53 const BROWSER_UNKNOWN = 'unknown';
54 const VERSION_UNKNOWN = 'unknown';
55
56 const BROWSER_OPERA = 'Opera'; // http://www.opera.com/
57 const BROWSER_OPERA_MINI = 'Opera Mini'; // http://www.opera.com/mini/
58 const BROWSER_WEBTV = 'WebTV'; // http://www.webtv.net/pc/
59 const BROWSER_EDGE = 'Edge'; // https://www.microsoft.com/edge
60 const BROWSER_IE = 'Internet Explorer'; // http://www.microsoft.com/ie/
61 const BROWSER_POCKET_IE = 'Pocket Internet Explorer'; // http://en.wikipedia.org/wiki/Internet_Explorer_Mobile
62 const BROWSER_KONQUEROR = 'Konqueror'; // http://www.konqueror.org/
63 const BROWSER_ICAB = 'iCab'; // http://www.icab.de/
64 const BROWSER_OMNIWEB = 'OmniWeb'; // http://www.omnigroup.com/applications/omniweb/
65 const BROWSER_FIREBIRD = 'Firebird'; // http://www.ibphoenix.com/
66 const BROWSER_FIREFOX = 'Firefox'; // http://www.mozilla.com/en-US/firefox/firefox.html
67 const BROWSER_ICEWEASEL = 'Iceweasel'; // http://www.geticeweasel.org/
68 const BROWSER_SHIRETOKO = 'Shiretoko'; // http://wiki.mozilla.org/Projects/shiretoko
69 const BROWSER_MOZILLA = 'Mozilla'; // http://www.mozilla.com/en-US/
70 const BROWSER_AMAYA = 'Amaya'; // http://www.w3.org/Amaya/
71 const BROWSER_LYNX = 'Lynx'; // http://en.wikipedia.org/wiki/Lynx
72 const BROWSER_SAFARI = 'Safari'; // http://apple.com
73 const BROWSER_IPHONE = 'iPhone'; // http://apple.com
74 const BROWSER_IPOD = 'iPod'; // http://apple.com
75 const BROWSER_IPAD = 'iPad'; // http://apple.com
76 const BROWSER_CHROME = 'Chrome'; // http://www.google.com/chrome
77 const BROWSER_ANDROID = 'Android'; // http://www.android.com/
78 const BROWSER_GOOGLEBOT = 'GoogleBot'; // http://en.wikipedia.org/wiki/Googlebot
79
80 const BROWSER_YANDEXBOT = 'YandexBot'; // http://yandex.com/bots
81 const BROWSER_YANDEXIMAGERESIZER_BOT = 'YandexImageResizer'; // http://yandex.com/bots
82 const BROWSER_YANDEXIMAGES_BOT = 'YandexImages'; // http://yandex.com/bots
83 const BROWSER_YANDEXVIDEO_BOT = 'YandexVideo'; // http://yandex.com/bots
84 const BROWSER_YANDEXMEDIA_BOT = 'YandexMedia'; // http://yandex.com/bots
85 const BROWSER_YANDEXBLOGS_BOT = 'YandexBlogs'; // http://yandex.com/bots
86 const BROWSER_YANDEXFAVICONS_BOT = 'YandexFavicons'; // http://yandex.com/bots
87 const BROWSER_YANDEXWEBMASTER_BOT = 'YandexWebmaster'; // http://yandex.com/bots
88 const BROWSER_YANDEXDIRECT_BOT = 'YandexDirect'; // http://yandex.com/bots
89 const BROWSER_YANDEXMETRIKA_BOT = 'YandexMetrika'; // http://yandex.com/bots
90 const BROWSER_YANDEXNEWS_BOT = 'YandexNews'; // http://yandex.com/bots
91 const BROWSER_YANDEXCATALOG_BOT = 'YandexCatalog'; // http://yandex.com/bots
92
93 const BROWSER_SLURP = 'Yahoo! Slurp'; // http://en.wikipedia.org/wiki/Yahoo!_Slurp
94 const BROWSER_W3CVALIDATOR = 'W3C Validator'; // http://validator.w3.org/
95 const BROWSER_BLACKBERRY = 'BlackBerry'; // http://www.blackberry.com/
96 const BROWSER_ICECAT = 'IceCat'; // http://en.wikipedia.org/wiki/GNU_IceCat
97 const BROWSER_NOKIA_S60 = 'Nokia S60 OSS Browser'; // http://en.wikipedia.org/wiki/Web_Browser_for_S60
98 const BROWSER_NOKIA = 'Nokia Browser'; // * all other WAP-based browsers on the Nokia Platform
99 const BROWSER_MSN = 'MSN Browser'; // http://explorer.msn.com/
100 const BROWSER_MSNBOT = 'MSN Bot'; // http://search.msn.com/msnbot.htm
101 const BROWSER_BINGBOT = 'Bing Bot'; // http://en.wikipedia.org/wiki/Bingbot
102 const BROWSER_VIVALDI = 'Vivalidi'; // https://vivaldi.com/
103 const BROWSER_YANDEX = 'Yandex'; // https://browser.yandex.ua/
104
105 const BROWSER_NETSCAPE_NAVIGATOR = 'Netscape Navigator'; // http://browser.netscape.com/ (DEPRECATED)
106 const BROWSER_GALEON = 'Galeon'; // http://galeon.sourceforge.net/ (DEPRECATED)
107 const BROWSER_NETPOSITIVE = 'NetPositive'; // http://en.wikipedia.org/wiki/NetPositive (DEPRECATED)
108 const BROWSER_PHOENIX = 'Phoenix'; // http://en.wikipedia.org/wiki/History_of_Mozilla_Firefox (DEPRECATED)
109 const BROWSER_PLAYSTATION = "PlayStation";
110 const BROWSER_SAMSUNG = "SamsungBrowser";
111 const BROWSER_SILK = "Silk";
112 const BROWSER_I_FRAME = "Iframely";
113 const BROWSER_COCOA = "CocoaRestClient";
114
115 const PLATFORM_UNKNOWN = 'unknown';
116 const PLATFORM_WINDOWS = 'Windows';
117 const PLATFORM_WINDOWS_CE = 'Windows CE';
118 const PLATFORM_APPLE = 'Apple';
119 const PLATFORM_LINUX = 'Linux';
120 const PLATFORM_OS2 = 'OS/2';
121 const PLATFORM_BEOS = 'BeOS';
122 const PLATFORM_IPHONE = 'iPhone';
123 const PLATFORM_IPOD = 'iPod';
124 const PLATFORM_IPAD = 'iPad';
125 const PLATFORM_BLACKBERRY = 'BlackBerry';
126 const PLATFORM_NOKIA = 'Nokia';
127 const PLATFORM_FREEBSD = 'FreeBSD';
128 const PLATFORM_OPENBSD = 'OpenBSD';
129 const PLATFORM_NETBSD = 'NetBSD';
130 const PLATFORM_SUNOS = 'SunOS';
131 const PLATFORM_OPENSOLARIS = 'OpenSolaris';
132 const PLATFORM_ANDROID = 'Android';
133 const PLATFORM_PLAYSTATION = "Sony PlayStation";
134 const PLATFORM_ROKU = "Roku";
135 const PLATFORM_APPLE_TV = "Apple TV";
136 const PLATFORM_TERMINAL = "Terminal";
137 const PLATFORM_FIRE_OS = "Fire OS";
138 const PLATFORM_SMART_TV = "SMART-TV";
139 const PLATFORM_CHROME_OS = "Chrome OS";
140 const PLATFORM_JAVA_ANDROID = "Java/Android";
141 const PLATFORM_POSTMAN = "Postman";
142 const PLATFORM_I_FRAME = "Iframely";
143
144 const OPERATING_SYSTEM_UNKNOWN = 'unknown';
145
146 /**
147 * Class constructor
148 */
149 public function __construct($userAgent = "")
150 {
151 $this->reset();
152 if ($userAgent != "") {
153 $this->setUserAgent($userAgent);
154 } else {
155 $this->determine();
156 }
157 }
158
159 /**
160 * Reset all properties
161 */
162 public function reset()
163 {
164 $this->_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
165 $this->_browser_name = self::BROWSER_UNKNOWN;
166 $this->_version = self::VERSION_UNKNOWN;
167 $this->_platform = self::PLATFORM_UNKNOWN;
168 $this->_os = self::OPERATING_SYSTEM_UNKNOWN;
169 $this->_is_aol = false;
170 $this->_is_mobile = false;
171 $this->_is_tablet = false;
172 $this->_is_robot = false;
173 $this->_is_facebook = false;
174 $this->_aol_version = self::VERSION_UNKNOWN;
175 }
176
177 /**
178 * Check to see if the specific browser is valid
179 * @param string $browserName
180 * @return bool True if the browser is the specified browser
181 */
182 function isBrowser($browserName)
183 {
184 return (0 == strcasecmp($this->_browser_name, trim($browserName)));
185 }
186
187 /**
188 * The name of the browser. All return types are from the class contants
189 * @return string Name of the browser
190 */
191 public function getBrowser()
192 {
193 return $this->_browser_name;
194 }
195
196 /**
197 * Set the name of the browser
198 * @param $browser string The name of the Browser
199 */
200 public function setBrowser($browser)
201 {
202 $this->_browser_name = $browser;
203 }
204
205 /**
206 * The name of the platform. All return types are from the class contants
207 * @return string Name of the browser
208 */
209 public function getPlatform()
210 {
211 return $this->_platform;
212 }
213
214 /**
215 * Set the name of the platform
216 * @param string $platform The name of the Platform
217 */
218 public function setPlatform($platform)
219 {
220 $this->_platform = $platform;
221 }
222
223 /**
224 * The version of the browser.
225 * @return string Version of the browser (will only contain alpha-numeric characters and a period)
226 */
227 public function getVersion()
228 {
229 return $this->_version;
230 }
231
232 /**
233 * Set the version of the browser
234 * @param string $version The version of the Browser
235 */
236 public function setVersion($version)
237 {
238 $this->_version = preg_replace('/[^0-9,.,a-z,A-Z-]/', '', $version);
239 }
240
241 /**
242 * The version of AOL.
243 * @return string Version of AOL (will only contain alpha-numeric characters and a period)
244 */
245 public function getAolVersion()
246 {
247 return $this->_aol_version;
248 }
249
250 /**
251 * Set the version of AOL
252 * @param string $version The version of AOL
253 */
254 public function setAolVersion($version)
255 {
256 $this->_aol_version = preg_replace('/[^0-9,.,a-z,A-Z]/', '', $version);
257 }
258
259 /**
260 * Is the browser from AOL?
261 * @return boolean True if the browser is from AOL otherwise false
262 */
263 public function isAol()
264 {
265 return $this->_is_aol;
266 }
267
268 /**
269 * Is the browser from a mobile device?
270 * @return boolean True if the browser is from a mobile device otherwise false
271 */
272 public function isMobile()
273 {
274 return $this->_is_mobile;
275 }
276
277 /**
278 * Is the browser from a tablet device?
279 * @return boolean True if the browser is from a tablet device otherwise false
280 */
281 public function isTablet()
282 {
283 return $this->_is_tablet;
284 }
285
286 /**
287 * Is the browser from a robot (ex Slurp,GoogleBot)?
288 * @return boolean True if the browser is from a robot otherwise false
289 */
290 public function isRobot()
291 {
292 return $this->_is_robot;
293 }
294
295 /**
296 * Is the browser from facebook?
297 * @return boolean True if the browser is from facebook otherwise false
298 */
299 public function isFacebook()
300 {
301 return $this->_is_facebook;
302 }
303
304 /**
305 * Set the browser to be from AOL
306 * @param $isAol
307 */
308 public function setAol($isAol)
309 {
310 $this->_is_aol = $isAol;
311 }
312
313 /**
314 * Set the Browser to be mobile
315 * @param boolean $value is the browser a mobile browser or not
316 */
317 protected function setMobile($value = true)
318 {
319 $this->_is_mobile = $value;
320 }
321
322 /**
323 * Set the Browser to be tablet
324 * @param boolean $value is the browser a tablet browser or not
325 */
326 protected function setTablet($value = true)
327 {
328 $this->_is_tablet = $value;
329 }
330
331 /**
332 * Set the Browser to be a robot
333 * @param boolean $value is the browser a robot or not
334 */
335 protected function setRobot($value = true)
336 {
337 $this->_is_robot = $value;
338 }
339
340 /**
341 * Set the Browser to be a Facebook request
342 * @param boolean $value is the browser a robot or not
343 */
344 protected function setFacebook($value = true)
345 {
346 $this->_is_facebook = $value;
347 }
348
349 /**
350 * Get the user agent value in use to determine the browser
351 * @return string The user agent from the HTTP header
352 */
353 public function getUserAgent()
354 {
355 return $this->_agent;
356 }
357
358 /**
359 * Set the user agent value (the construction will use the HTTP header value - this will overwrite it)
360 * @param string $agent_string The value for the User Agent
361 */
362 public function setUserAgent($agent_string)
363 {
364 $this->reset();
365 $this->_agent = $agent_string;
366 $this->determine();
367 }
368
369 /**
370 * Used to determine if the browser is actually "chromeframe"
371 * @since 1.7
372 * @return boolean True if the browser is using chromeframe
373 */
374 public function isChromeFrame()
375 {
376 return (strpos($this->_agent, "chromeframe") !== false);
377 }
378
379 /**
380 * Returns a formatted string with a summary of the details of the browser.
381 * @return string formatted string with a summary of the browser
382 */
383 public function __toString()
384 {
385 return "<strong>Browser Name:</strong> {$this->getBrowser()}<br/>\n" .
386 "<strong>Browser Version:</strong> {$this->getVersion()}<br/>\n" .
387 "<strong>Browser User Agent String:</strong> {$this->getUserAgent()}<br/>\n" .
388 "<strong>Platform:</strong> {$this->getPlatform()}<br/>";
389 }
390
391 /**
392 * Protected routine to calculate and determine what the browser is in use (including platform)
393 */
394 protected function determine()
395 {
396 $this->checkPlatform();
397 $this->checkBrowsers();
398 $this->checkForAol();
399 }
400
401 /**
402 * Protected routine to determine the browser type
403 * @return boolean True if the browser was detected otherwise false
404 */
405 protected function checkBrowsers()
406 {
407 return (
408 // well-known, well-used
409 // Special Notes:
410 // (1) Opera must be checked before FireFox due to the odd
411 // user agents used in some older versions of Opera
412 // (2) WebTV is strapped onto Internet Explorer so we must
413 // check for WebTV before IE
414 // (3) (deprecated) Galeon is based on Firefox and needs to be
415 // tested before Firefox is tested
416 // (4) OmniWeb is based on Safari so OmniWeb check must occur
417 // before Safari
418 // (5) Netscape 9+ is based on Firefox so Netscape checks
419 // before FireFox are necessary
420 // (6) Vivalid is UA contains both Firefox and Chrome so Vivalid checks
421 // before Firefox and Chrome
422 $this->checkBrowserWebTv() ||
423 $this->checkBrowserEdge() ||
424 $this->checkBrowserInternetExplorer() ||
425 $this->checkBrowserOpera() ||
426 $this->checkBrowserGaleon() ||
427 $this->checkBrowserNetscapeNavigator9Plus() ||
428 $this->checkBrowserVivaldi() ||
429 $this->checkBrowserYandex() ||
430 $this->checkBrowserFirefox() ||
431 $this->checkBrowserChrome() ||
432 $this->checkBrowserOmniWeb() ||
433
434 // common mobile
435 $this->checkBrowserAndroid() ||
436 $this->checkBrowseriPad() ||
437 $this->checkBrowseriPod() ||
438 $this->checkBrowseriPhone() ||
439 $this->checkBrowserBlackBerry() ||
440 $this->checkBrowserNokia() ||
441
442 // common bots
443 $this->checkBrowserGoogleBot() ||
444 $this->checkBrowserMSNBot() ||
445 $this->checkBrowserBingBot() ||
446 $this->checkBrowserSlurp() ||
447
448 // Yandex bots
449 $this->checkBrowserYandexBot() ||
450 $this->checkBrowserYandexImageResizerBot() ||
451 $this->checkBrowserYandexBlogsBot() ||
452 $this->checkBrowserYandexCatalogBot() ||
453 $this->checkBrowserYandexDirectBot() ||
454 $this->checkBrowserYandexFaviconsBot() ||
455 $this->checkBrowserYandexImagesBot() ||
456 $this->checkBrowserYandexMediaBot() ||
457 $this->checkBrowserYandexMetrikaBot() ||
458 $this->checkBrowserYandexNewsBot() ||
459 $this->checkBrowserYandexVideoBot() ||
460 $this->checkBrowserYandexWebmasterBot() ||
461
462 // check for facebook external hit when loading URL
463 $this->checkFacebookExternalHit() ||
464
465 // WebKit base check (post mobile and others)
466 $this->checkBrowserSamsung() ||
467 $this->checkBrowserSilk() ||
468 $this->checkBrowserSafari() ||
469
470 // everyone else
471 $this->checkBrowserNetPositive() ||
472 $this->checkBrowserFirebird() ||
473 $this->checkBrowserKonqueror() ||
474 $this->checkBrowserIcab() ||
475 $this->checkBrowserPhoenix() ||
476 $this->checkBrowserAmaya() ||
477 $this->checkBrowserLynx() ||
478 $this->checkBrowserShiretoko() ||
479 $this->checkBrowserIceCat() ||
480 $this->checkBrowserIceweasel() ||
481 $this->checkBrowserW3CValidator() ||
482 $this->checkBrowserPlayStation() ||
483 $this->checkBrowserIframely() ||
484 $this->checkBrowserCocoa() ||
485 $this->checkBrowserMozilla() /* Mozilla is such an open standard that you must check it last */
486
487
488 );
489 }
490
491 /**
492 * Determine if the user is using a BlackBerry (last updated 1.7)
493 * @return boolean True if the browser is the BlackBerry browser otherwise false
494 */
495 protected function checkBrowserBlackBerry()
496 {
497 if (stripos($this->_agent, 'blackberry') !== false) {
498 $aresult = explode("/", stristr($this->_agent, "BlackBerry"));
499 if (isset($aresult[1])) {
500 $aversion = explode(' ', $aresult[1]);
501 $this->setVersion($aversion[0]);
502 $this->_browser_name = self::BROWSER_BLACKBERRY;
503 $this->setMobile(true);
504 return true;
505 }
506 }
507 return false;
508 }
509
510 /**
511 * Determine if the user is using an AOL User Agent (last updated 1.7)
512 * @return boolean True if the browser is from AOL otherwise false
513 */
514 protected function checkForAol()
515 {
516 $this->setAol(false);
517 $this->setAolVersion(self::VERSION_UNKNOWN);
518
519 if (stripos($this->_agent, 'aol') !== false) {
520 $aversion = explode(' ', stristr($this->_agent, 'AOL'));
521 if (isset($aversion[1])) {
522 $this->setAol(true);
523 $this->setAolVersion(preg_replace('/[^0-9\.a-z]/i', '', $aversion[1]));
524 return true;
525 }
526 }
527 return false;
528 }
529
530 /**
531 * Determine if the browser is the GoogleBot or not (last updated 1.7)
532 * @return boolean True if the browser is the GoogletBot otherwise false
533 */
534 protected function checkBrowserGoogleBot()
535 {
536 if (stripos($this->_agent, 'googlebot') !== false) {
537 $aresult = explode('/', stristr($this->_agent, 'googlebot'));
538 if (isset($aresult[1])) {
539 $aversion = explode(' ', $aresult[1]);
540 $this->setVersion(str_replace(';', '', $aversion[0]));
541 $this->_browser_name = self::BROWSER_GOOGLEBOT;
542 $this->setRobot(true);
543 return true;
544 }
545 }
546 return false;
547 }
548
549 /**
550 * Determine if the browser is the YandexBot or not
551 * @return boolean True if the browser is the YandexBot otherwise false
552 */
553 protected function checkBrowserYandexBot()
554 {
555 if (stripos($this->_agent, 'YandexBot') !== false) {
556 $aresult = explode('/', stristr($this->_agent, 'YandexBot'));
557 if (isset($aresult[1])) {
558 $aversion = explode(' ', $aresult[1]);
559 $this->setVersion(str_replace(';', '', $aversion[0]));
560 $this->_browser_name = self::BROWSER_YANDEXBOT;
561 $this->setRobot(true);
562 return true;
563 }
564 }
565 return false;
566 }
567
568 /**
569 * Determine if the browser is the YandexImageResizer or not
570 * @return boolean True if the browser is the YandexImageResizer otherwise false
571 */
572 protected function checkBrowserYandexImageResizerBot()
573 {
574 if (stripos($this->_agent, 'YandexImageResizer') !== false) {
575 $aresult = explode('/', stristr($this->_agent, 'YandexImageResizer'));
576 if (isset($aresult[1])) {
577 $aversion = explode(' ', $aresult[1]);
578 $this->setVersion(str_replace(';', '', $aversion[0]));
579 $this->_browser_name = self::BROWSER_YANDEXIMAGERESIZER_BOT;
580 $this->setRobot(true);
581 return true;
582 }
583 }
584 return false;
585 }
586
587 /**
588 * Determine if the browser is the YandexCatalog or not
589 * @return boolean True if the browser is the YandexCatalog otherwise false
590 */
591 protected function checkBrowserYandexCatalogBot()
592 {
593 if (stripos($this->_agent, 'YandexCatalog') !== false) {
594 $aresult = explode('/', stristr($this->_agent, 'YandexCatalog'));
595 if (isset($aresult[1])) {
596 $aversion = explode(' ', $aresult[1]);
597 $this->setVersion(str_replace(';', '', $aversion[0]));
598 $this->_browser_name = self::BROWSER_YANDEXCATALOG_BOT;
599 $this->setRobot(true);
600 return true;
601 }
602 }
603 return false;
604 }
605
606 /**
607 * Determine if the browser is the YandexNews or not
608 * @return boolean True if the browser is the YandexNews otherwise false
609 */
610 protected function checkBrowserYandexNewsBot()
611 {
612 if (stripos($this->_agent, 'YandexNews') !== false) {
613 $aresult = explode('/', stristr($this->_agent, 'YandexNews'));
614 if (isset($aresult[1])) {
615 $aversion = explode(' ', $aresult[1]);
616 $this->setVersion(str_replace(';', '', $aversion[0]));
617 $this->_browser_name = self::BROWSER_YANDEXNEWS_BOT;
618 $this->setRobot(true);
619 return true;
620 }
621 }
622 return false;
623 }
624
625 /**
626 * Determine if the browser is the YandexMetrika or not
627 * @return boolean True if the browser is the YandexMetrika otherwise false
628 */
629 protected function checkBrowserYandexMetrikaBot()
630 {
631 if (stripos($this->_agent, 'YandexMetrika') !== false) {
632 $aresult = explode('/', stristr($this->_agent, 'YandexMetrika'));
633 if (isset($aresult[1])) {
634 $aversion = explode(' ', $aresult[1]);
635 $this->setVersion(str_replace(';', '', $aversion[0]));
636 $this->_browser_name = self::BROWSER_YANDEXMETRIKA_BOT;
637 $this->setRobot(true);
638 return true;
639 }
640 }
641 return false;
642 }
643
644 /**
645 * Determine if the browser is the YandexDirect or not
646 * @return boolean True if the browser is the YandexDirect otherwise false
647 */
648 protected function checkBrowserYandexDirectBot()
649 {
650 if (stripos($this->_agent, 'YandexDirect') !== false) {
651 $aresult = explode('/', stristr($this->_agent, 'YandexDirect'));
652 if (isset($aresult[1])) {
653 $aversion = explode(' ', $aresult[1]);
654 $this->setVersion(str_replace(';', '', $aversion[0]));
655 $this->_browser_name = self::BROWSER_YANDEXDIRECT_BOT;
656 $this->setRobot(true);
657 return true;
658 }
659 }
660 return false;
661 }
662
663 /**
664 * Determine if the browser is the YandexWebmaster or not
665 * @return boolean True if the browser is the YandexWebmaster otherwise false
666 */
667 protected function checkBrowserYandexWebmasterBot()
668 {
669 if (stripos($this->_agent, 'YandexWebmaster') !== false) {
670 $aresult = explode('/', stristr($this->_agent, 'YandexWebmaster'));
671 if (isset($aresult[1])) {
672 $aversion = explode(' ', $aresult[1]);
673 $this->setVersion(str_replace(';', '', $aversion[0]));
674 $this->_browser_name = self::BROWSER_YANDEXWEBMASTER_BOT;
675 $this->setRobot(true);
676 return true;
677 }
678 }
679 return false;
680 }
681
682 /**
683 * Determine if the browser is the YandexFavicons or not
684 * @return boolean True if the browser is the YandexFavicons otherwise false
685 */
686 protected function checkBrowserYandexFaviconsBot()
687 {
688 if (stripos($this->_agent, 'YandexFavicons') !== false) {
689 $aresult = explode('/', stristr($this->_agent, 'YandexFavicons'));
690 if (isset($aresult[1])) {
691 $aversion = explode(' ', $aresult[1]);
692 $this->setVersion(str_replace(';', '', $aversion[0]));
693 $this->_browser_name = self::BROWSER_YANDEXFAVICONS_BOT;
694 $this->setRobot(true);
695 return true;
696 }
697 }
698 return false;
699 }
700
701 /**
702 * Determine if the browser is the YandexBlogs or not
703 * @return boolean True if the browser is the YandexBlogs otherwise false
704 */
705 protected function checkBrowserYandexBlogsBot()
706 {
707 if (stripos($this->_agent, 'YandexBlogs') !== false) {
708 $aresult = explode('/', stristr($this->_agent, 'YandexBlogs'));
709 if (isset($aresult[1])) {
710 $aversion = explode(' ', $aresult[1]);
711 $this->setVersion(str_replace(';', '', $aversion[0]));
712 $this->_browser_name = self::BROWSER_YANDEXBLOGS_BOT;
713 $this->setRobot(true);
714 return true;
715 }
716 }
717 return false;
718 }
719
720 /**
721 * Determine if the browser is the YandexMedia or not
722 * @return boolean True if the browser is the YandexMedia otherwise false
723 */
724 protected function checkBrowserYandexMediaBot()
725 {
726 if (stripos($this->_agent, 'YandexMedia') !== false) {
727 $aresult = explode('/', stristr($this->_agent, 'YandexMedia'));
728 if (isset($aresult[1])) {
729 $aversion = explode(' ', $aresult[1]);
730 $this->setVersion(str_replace(';', '', $aversion[0]));
731 $this->_browser_name = self::BROWSER_YANDEXMEDIA_BOT;
732 $this->setRobot(true);
733 return true;
734 }
735 }
736 return false;
737 }
738
739 /**
740 * Determine if the browser is the YandexVideo or not
741 * @return boolean True if the browser is the YandexVideo otherwise false
742 */
743 protected function checkBrowserYandexVideoBot()
744 {
745 if (stripos($this->_agent, 'YandexVideo') !== false) {
746 $aresult = explode('/', stristr($this->_agent, 'YandexVideo'));
747 if (isset($aresult[1])) {
748 $aversion = explode(' ', $aresult[1]);
749 $this->setVersion(str_replace(';', '', $aversion[0]));
750 $this->_browser_name = self::BROWSER_YANDEXVIDEO_BOT;
751 $this->setRobot(true);
752 return true;
753 }
754 }
755 return false;
756 }
757
758 /**
759 * Determine if the browser is the YandexImages or not
760 * @return boolean True if the browser is the YandexImages otherwise false
761 */
762 protected function checkBrowserYandexImagesBot()
763 {
764 if (stripos($this->_agent, 'YandexImages') !== false) {
765 $aresult = explode('/', stristr($this->_agent, 'YandexImages'));
766 if (isset($aresult[1])) {
767 $aversion = explode(' ', $aresult[1]);
768 $this->setVersion(str_replace(';', '', $aversion[0]));
769 $this->_browser_name = self::BROWSER_YANDEXIMAGES_BOT;
770 $this->setRobot(true);
771 return true;
772 }
773 }
774 return false;
775 }
776
777 /**
778 * Determine if the browser is the MSNBot or not (last updated 1.9)
779 * @return boolean True if the browser is the MSNBot otherwise false
780 */
781 protected function checkBrowserMSNBot()
782 {
783 if (stripos($this->_agent, "msnbot") !== false) {
784 $aresult = explode("/", stristr($this->_agent, "msnbot"));
785 if (isset($aresult[1])) {
786 $aversion = explode(" ", $aresult[1]);
787 $this->setVersion(str_replace(";", "", $aversion[0]));
788 $this->_browser_name = self::BROWSER_MSNBOT;
789 $this->setRobot(true);
790 return true;
791 }
792 }
793 return false;
794 }
795
796 /**
797 * Determine if the browser is the BingBot or not (last updated 1.9)
798 * @return boolean True if the browser is the BingBot otherwise false
799 */
800 protected function checkBrowserBingBot()
801 {
802 if (stripos($this->_agent, "bingbot") !== false) {
803 $aresult = explode("/", stristr($this->_agent, "bingbot"));
804 if (isset($aresult[1])) {
805 $aversion = explode(" ", $aresult[1]);
806 $this->setVersion(str_replace(";", "", $aversion[0]));
807 $this->_browser_name = self::BROWSER_BINGBOT;
808 $this->setRobot(true);
809 return true;
810 }
811 }
812 return false;
813 }
814
815 /**
816 * Determine if the browser is the W3C Validator or not (last updated 1.7)
817 * @return boolean True if the browser is the W3C Validator otherwise false
818 */
819 protected function checkBrowserW3CValidator()
820 {
821 if (stripos($this->_agent, 'W3C-checklink') !== false) {
822 $aresult = explode('/', stristr($this->_agent, 'W3C-checklink'));
823 if (isset($aresult[1])) {
824 $aversion = explode(' ', $aresult[1]);
825 $this->setVersion($aversion[0]);
826 $this->_browser_name = self::BROWSER_W3CVALIDATOR;
827 return true;
828 }
829 } else if (stripos($this->_agent, 'W3C_Validator') !== false) {
830 // Some of the Validator versions do not delineate w/ a slash - add it back in
831 $ua = str_replace("W3C_Validator ", "W3C_Validator/", $this->_agent);
832 $aresult = explode('/', stristr($ua, 'W3C_Validator'));
833 if (isset($aresult[1])) {
834 $aversion = explode(' ', $aresult[1]);
835 $this->setVersion($aversion[0]);
836 $this->_browser_name = self::BROWSER_W3CVALIDATOR;
837 return true;
838 }
839 } else if (stripos($this->_agent, 'W3C-mobileOK') !== false) {
840 $this->_browser_name = self::BROWSER_W3CVALIDATOR;
841 $this->setMobile(true);
842 return true;
843 }
844 return false;
845 }
846
847 /**
848 * Determine if the browser is the Yahoo! Slurp Robot or not (last updated 1.7)
849 * @return boolean True if the browser is the Yahoo! Slurp Robot otherwise false
850 */
851 protected function checkBrowserSlurp()
852 {
853 if (stripos($this->_agent, 'slurp') !== false) {
854 $aresult = explode('/', stristr($this->_agent, 'Slurp'));
855 if (isset($aresult[1])) {
856 $aversion = explode(' ', $aresult[1]);
857 $this->setVersion($aversion[0]);
858 $this->_browser_name = self::BROWSER_SLURP;
859 $this->setRobot(true);
860 $this->setMobile(false);
861 return true;
862 }
863 }
864 return false;
865 }
866
867 /**
868 * Determine if the browser is Edge or not
869 * @return boolean True if the browser is Edge otherwise false
870 */
871 protected function checkBrowserEdge()
872 {
873 if (stripos($this->_agent, 'Edge/') !== false) {
874 $aresult = explode('/', stristr($this->_agent, 'Edge'));
875 if (isset($aresult[1])) {
876 $aversion = explode(' ', $aresult[1]);
877 $this->setVersion($aversion[0]);
878 $this->setBrowser(self::BROWSER_EDGE);
879 if (stripos($this->_agent, 'Windows Phone') !== false || stripos($this->_agent, 'Android') !== false) {
880 $this->setMobile(true);
881 }
882 return true;
883 }
884 }
885 return false;
886 }
887
888 /**
889 * Determine if the browser is Internet Explorer or not (last updated 1.7)
890 * @return boolean True if the browser is Internet Explorer otherwise false
891 */
892 protected function checkBrowserInternetExplorer()
893 {
894 // Test for IE11
895 if (stripos($this->_agent, 'Trident/7.0; rv:11.0') !== false) {
896 $this->setBrowser(self::BROWSER_IE);
897 $this->setVersion('11.0');
898 return true;
899 } // Test for v1 - v1.5 IE
900 else if (stripos($this->_agent, 'microsoft internet explorer') !== false) {
901 $this->setBrowser(self::BROWSER_IE);
902 $this->setVersion('1.0');
903 $aresult = stristr($this->_agent, '/');
904 if (preg_match('/308|425|426|474|0b1/i', $aresult)) {
905 $this->setVersion('1.5');
906 }
907 return true;
908 } // Test for versions > 1.5
909 else if (stripos($this->_agent, 'msie') !== false && stripos($this->_agent, 'opera') === false) {
910 // See if the browser is the odd MSN Explorer
911 if (stripos($this->_agent, 'msnb') !== false) {
912 $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'MSN'));
913 if (isset($aresult[1])) {
914 $this->setBrowser(self::BROWSER_MSN);
915 $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1]));
916 return true;
917 }
918 }
919 $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'msie'));
920 if (isset($aresult[1])) {
921 $this->setBrowser(self::BROWSER_IE);
922 $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1]));
923 if(preg_match('#trident/([0-9\.]+);#i', $this->_agent, $aresult)){
924 if($aresult[1] == '3.1'){
925 $this->setVersion('7.0');
926 }
927 else if($aresult[1] == '4.0'){
928 $this->setVersion('8.0');
929 }
930 else if($aresult[1] == '5.0'){
931 $this->setVersion('9.0');
932 }
933 else if($aresult[1] == '6.0'){
934 $this->setVersion('10.0');
935 }
936 else if($aresult[1] == '7.0'){
937 $this->setVersion('11.0');
938 }
939 else if($aresult[1] == '8.0'){
940 $this->setVersion('11.0');
941 }
942 }
943 if(stripos($this->_agent, 'IEMobile') !== false) {
944 $this->setBrowser(self::BROWSER_POCKET_IE);
945 $this->setMobile(true);
946 }
947 return true;
948 }
949 } // Test for versions > IE 10
950 else if (stripos($this->_agent, 'trident') !== false) {
951 $this->setBrowser(self::BROWSER_IE);
952 $result = explode('rv:', $this->_agent);
953 if (isset($result[1])) {
954 $this->setVersion(preg_replace('/[^0-9.]+/', '', $result[1]));
955 $this->_agent = str_replace(array("Mozilla", "Gecko"), "MSIE", $this->_agent);
956 }
957 } // Test for Pocket IE
958 else if (stripos($this->_agent, 'mspie') !== false || stripos($this->_agent, 'pocket') !== false) {
959 $aresult = explode(' ', stristr($this->_agent, 'mspie'));
960 if (isset($aresult[1])) {
961 $this->setPlatform(self::PLATFORM_WINDOWS_CE);
962 $this->setBrowser(self::BROWSER_POCKET_IE);
963 $this->setMobile(true);
964
965 if (stripos($this->_agent, 'mspie') !== false) {
966 $this->setVersion($aresult[1]);
967 } else {
968 $aversion = explode('/', $this->_agent);
969 if (isset($aversion[1])) {
970 $this->setVersion($aversion[1]);
971 }
972 }
973 return true;
974 }
975 }
976 return false;
977 }
978
979 /**
980 * Determine if the browser is Opera or not (last updated 1.7)
981 * @return boolean True if the browser is Opera otherwise false
982 */
983 protected function checkBrowserOpera()
984 {
985 if (stripos($this->_agent, 'opera mini') !== false) {
986 $resultant = stristr($this->_agent, 'opera mini');
987 if (preg_match('/\//', $resultant)) {
988 $aresult = explode('/', $resultant);
989 if (isset($aresult[1])) {
990 $aversion = explode(' ', $aresult[1]);
991 $this->setVersion($aversion[0]);
992 }
993 } else {
994 $aversion = explode(' ', stristr($resultant, 'opera mini'));
995 if (isset($aversion[1])) {
996 $this->setVersion($aversion[1]);
997 }
998 }
999 $this->_browser_name = self::BROWSER_OPERA_MINI;
1000 $this->setMobile(true);
1001 return true;
1002 } else if (stripos($this->_agent, 'opera') !== false) {
1003 $resultant = stristr($this->_agent, 'opera');
1004 if (preg_match('/Version\/(1*.*)$/', $resultant, $matches)) {
1005 $this->setVersion($matches[1]);
1006 } else if (preg_match('/\//', $resultant)) {
1007 $aresult = explode('/', str_replace("(", " ", $resultant));
1008 if (isset($aresult[1])) {
1009 $aversion = explode(' ', $aresult[1]);
1010 $this->setVersion($aversion[0]);
1011 }
1012 } else {
1013 $aversion = explode(' ', stristr($resultant, 'opera'));
1014 $this->setVersion(isset($aversion[1]) ? $aversion[1] : "");
1015 }
1016 if (stripos($this->_agent, 'Opera Mobi') !== false) {
1017 $this->setMobile(true);
1018 }
1019 $this->_browser_name = self::BROWSER_OPERA;
1020 return true;
1021 } else if (stripos($this->_agent, 'OPR') !== false) {
1022 $resultant = stristr($this->_agent, 'OPR');
1023 if (preg_match('/\//', $resultant)) {
1024 $aresult = explode('/', str_replace("(", " ", $resultant));
1025 if (isset($aresult[1])) {
1026 $aversion = explode(' ', $aresult[1]);
1027 $this->setVersion($aversion[0]);
1028 }
1029 }
1030 if (stripos($this->_agent, 'Mobile') !== false) {
1031 $this->setMobile(true);
1032 }
1033 $this->_browser_name = self::BROWSER_OPERA;
1034 return true;
1035 }
1036 return false;
1037 }
1038
1039 /**
1040 * Determine if the browser is Chrome or not (last updated 1.7)
1041 * @return boolean True if the browser is Chrome otherwise false
1042 */
1043 protected function checkBrowserChrome()
1044 {
1045 if (stripos($this->_agent, 'Chrome') !== false) {
1046 $aresult = explode('/', stristr($this->_agent, 'Chrome'));
1047 if (isset($aresult[1])) {
1048 $aversion = explode(' ', $aresult[1]);
1049 $this->setVersion($aversion[0]);
1050 $this->setBrowser(self::BROWSER_CHROME);
1051 //Chrome on Android
1052 if (stripos($this->_agent, 'Android') !== false) {
1053 if (stripos($this->_agent, 'Mobile') !== false) {
1054 $this->setMobile(true);
1055 } else {
1056 $this->setTablet(true);
1057 }
1058 }
1059 return true;
1060 }
1061 }
1062 return false;
1063 }
1064
1065
1066 /**
1067 * Determine if the browser is WebTv or not (last updated 1.7)
1068 * @return boolean True if the browser is WebTv otherwise false
1069 */
1070 protected function checkBrowserWebTv()
1071 {
1072 if (stripos($this->_agent, 'webtv') !== false) {
1073 $aresult = explode('/', stristr($this->_agent, 'webtv'));
1074 if (isset($aresult[1])) {
1075 $aversion = explode(' ', $aresult[1]);
1076 $this->setVersion($aversion[0]);
1077 $this->setBrowser(self::BROWSER_WEBTV);
1078 return true;
1079 }
1080 }
1081 return false;
1082 }
1083
1084 /**
1085 * Determine if the browser is NetPositive or not (last updated 1.7)
1086 * @return boolean True if the browser is NetPositive otherwise false
1087 */
1088 protected function checkBrowserNetPositive()
1089 {
1090 if (stripos($this->_agent, 'NetPositive') !== false) {
1091 $aresult = explode('/', stristr($this->_agent, 'NetPositive'));
1092 if (isset($aresult[1])) {
1093 $aversion = explode(' ', $aresult[1]);
1094 $this->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0]));
1095 $this->setBrowser(self::BROWSER_NETPOSITIVE);
1096 return true;
1097 }
1098 }
1099 return false;
1100 }
1101
1102 /**
1103 * Determine if the browser is Galeon or not (last updated 1.7)
1104 * @return boolean True if the browser is Galeon otherwise false
1105 */
1106 protected function checkBrowserGaleon()
1107 {
1108 if (stripos($this->_agent, 'galeon') !== false) {
1109 $aresult = explode(' ', stristr($this->_agent, 'galeon'));
1110 $aversion = explode('/', $aresult[0]);
1111 if (isset($aversion[1])) {
1112 $this->setVersion($aversion[1]);
1113 $this->setBrowser(self::BROWSER_GALEON);
1114 return true;
1115 }
1116 }
1117 return false;
1118 }
1119
1120 /**
1121 * Determine if the browser is Konqueror or not (last updated 1.7)
1122 * @return boolean True if the browser is Konqueror otherwise false
1123 */
1124 protected function checkBrowserKonqueror()
1125 {
1126 if (stripos($this->_agent, 'Konqueror') !== false) {
1127 $aresult = explode(' ', stristr($this->_agent, 'Konqueror'));
1128 $aversion = explode('/', $aresult[0]);
1129 if (isset($aversion[1])) {
1130 $this->setVersion($aversion[1]);
1131 $this->setBrowser(self::BROWSER_KONQUEROR);
1132 return true;
1133 }
1134 }
1135 return false;
1136 }
1137
1138 /**
1139 * Determine if the browser is iCab or not (last updated 1.7)
1140 * @return boolean True if the browser is iCab otherwise false
1141 */
1142 protected function checkBrowserIcab()
1143 {
1144 if (stripos($this->_agent, 'icab') !== false) {
1145 $aversion = explode(' ', stristr(str_replace('/', ' ', $this->_agent), 'icab'));
1146 if (isset($aversion[1])) {
1147 $this->setVersion($aversion[1]);
1148 $this->setBrowser(self::BROWSER_ICAB);
1149 return true;
1150 }
1151 }
1152 return false;
1153 }
1154
1155 /**
1156 * Determine if the browser is OmniWeb or not (last updated 1.7)
1157 * @return boolean True if the browser is OmniWeb otherwise false
1158 */
1159 protected function checkBrowserOmniWeb()
1160 {
1161 if (stripos($this->_agent, 'omniweb') !== false) {
1162 $aresult = explode('/', stristr($this->_agent, 'omniweb'));
1163 $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : "");
1164 $this->setVersion($aversion[0]);
1165 $this->setBrowser(self::BROWSER_OMNIWEB);
1166 return true;
1167 }
1168 return false;
1169 }
1170
1171 /**
1172 * Determine if the browser is Phoenix or not (last updated 1.7)
1173 * @return boolean True if the browser is Phoenix otherwise false
1174 */
1175 protected function checkBrowserPhoenix()
1176 {
1177 if (stripos($this->_agent, 'Phoenix') !== false) {
1178 $aversion = explode('/', stristr($this->_agent, 'Phoenix'));
1179 if (isset($aversion[1])) {
1180 $this->setVersion($aversion[1]);
1181 $this->setBrowser(self::BROWSER_PHOENIX);
1182 return true;
1183 }
1184 }
1185 return false;
1186 }
1187
1188 /**
1189 * Determine if the browser is Firebird or not (last updated 1.7)
1190 * @return boolean True if the browser is Firebird otherwise false
1191 */
1192 protected function checkBrowserFirebird()
1193 {
1194 if (stripos($this->_agent, 'Firebird') !== false) {
1195 $aversion = explode('/', stristr($this->_agent, 'Firebird'));
1196 if (isset($aversion[1])) {
1197 $this->setVersion($aversion[1]);
1198 $this->setBrowser(self::BROWSER_FIREBIRD);
1199 return true;
1200 }
1201 }
1202 return false;
1203 }
1204
1205 /**
1206 * Determine if the browser is Netscape Navigator 9+ or not (last updated 1.7)
1207 * NOTE: (http://browser.netscape.com/ - Official support ended on March 1st, 2008)
1208 * @return boolean True if the browser is Netscape Navigator 9+ otherwise false
1209 */
1210 protected function checkBrowserNetscapeNavigator9Plus()
1211 {
1212 if (stripos($this->_agent, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', $this->_agent, $matches)) {
1213 $this->setVersion($matches[1]);
1214 $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
1215 return true;
1216 } else if (stripos($this->_agent, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', $this->_agent, $matches)) {
1217 $this->setVersion($matches[1]);
1218 $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
1219 return true;
1220 }
1221 return false;
1222 }
1223
1224 /**
1225 * Determine if the browser is Shiretoko or not (https://wiki.mozilla.org/Projects/shiretoko) (last updated 1.7)
1226 * @return boolean True if the browser is Shiretoko otherwise false
1227 */
1228 protected function checkBrowserShiretoko()
1229 {
1230 if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', $this->_agent, $matches)) {
1231 $this->setVersion($matches[1]);
1232 $this->setBrowser(self::BROWSER_SHIRETOKO);
1233 return true;
1234 }
1235 return false;
1236 }
1237
1238 /**
1239 * Determine if the browser is Ice Cat or not (http://en.wikipedia.org/wiki/GNU_IceCat) (last updated 1.7)
1240 * @return boolean True if the browser is Ice Cat otherwise false
1241 */
1242 protected function checkBrowserIceCat()
1243 {
1244 if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', $this->_agent, $matches)) {
1245 $this->setVersion($matches[1]);
1246 $this->setBrowser(self::BROWSER_ICECAT);
1247 return true;
1248 }
1249 return false;
1250 }
1251
1252 /**
1253 * Determine if the browser is Nokia or not (last updated 1.7)
1254 * @return boolean True if the browser is Nokia otherwise false
1255 */
1256 protected function checkBrowserNokia()
1257 {
1258 if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", $this->_agent, $matches)) {
1259 $this->setVersion($matches[2]);
1260 if (stripos($this->_agent, 'Series60') !== false || strpos($this->_agent, 'S60') !== false) {
1261 $this->setBrowser(self::BROWSER_NOKIA_S60);
1262 } else {
1263 $this->setBrowser(self::BROWSER_NOKIA);
1264 }
1265 $this->setMobile(true);
1266 return true;
1267 }
1268 return false;
1269 }
1270
1271 /**
1272 * Determine if the browser is Firefox or not (last updated 1.7)
1273 * @return boolean True if the browser is Firefox otherwise false
1274 */
1275 protected function checkBrowserFirefox()
1276 {
1277 if (stripos($this->_agent, 'safari') === false) {
1278 if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", $this->_agent, $matches)) {
1279 $this->setVersion($matches[1]);
1280 $this->setBrowser(self::BROWSER_FIREFOX);
1281 //Firefox on Android
1282 if (stripos($this->_agent, 'Android') !== false) {
1283 if (stripos($this->_agent, 'Mobile') !== false) {
1284 $this->setMobile(true);
1285 } else {
1286 $this->setTablet(true);
1287 }
1288 }
1289 return true;
1290 } else if (preg_match("/Firefox$/i", $this->_agent, $matches)) {
1291 $this->setVersion("");
1292 $this->setBrowser(self::BROWSER_FIREFOX);
1293 return true;
1294 }
1295 }
1296 return false;
1297 }
1298
1299 /**
1300 * Determine if the browser is Firefox or not (last updated 1.7)
1301 * @return boolean True if the browser is Firefox otherwise false
1302 */
1303 protected function checkBrowserIceweasel()
1304 {
1305 if (stripos($this->_agent, 'Iceweasel') !== false) {
1306 $aresult = explode('/', stristr($this->_agent, 'Iceweasel'));
1307 if (isset($aresult[1])) {
1308 $aversion = explode(' ', $aresult[1]);
1309 $this->setVersion($aversion[0]);
1310 $this->setBrowser(self::BROWSER_ICEWEASEL);
1311 return true;
1312 }
1313 }
1314 return false;
1315 }
1316
1317 /**
1318 * Determine if the browser is Mozilla or not (last updated 1.7)
1319 * @return boolean True if the browser is Mozilla otherwise false
1320 */
1321 protected function checkBrowserMozilla()
1322 {
1323 if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) {
1324 $aversion = explode(' ', stristr($this->_agent, 'rv:'));
1325 preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent, $aversion);
1326 $this->setVersion(str_replace('rv:', '', $aversion[0]));
1327 $this->setBrowser(self::BROWSER_MOZILLA);
1328 return true;
1329 } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) {
1330 $aversion = explode('', stristr($this->_agent, 'rv:'));
1331 $this->setVersion(str_replace('rv:', '', $aversion[0]));
1332 $this->setBrowser(self::BROWSER_MOZILLA);
1333 return true;
1334 } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', $this->_agent, $matches) && stripos($this->_agent, 'netscape') === false) {
1335 $this->setVersion($matches[1]);
1336 $this->setBrowser(self::BROWSER_MOZILLA);
1337 return true;
1338 }
1339 return false;
1340 }
1341
1342 /**
1343 * Determine if the browser is Lynx or not (last updated 1.7)
1344 * @return boolean True if the browser is Lynx otherwise false
1345 */
1346 protected function checkBrowserLynx()
1347 {
1348 if (stripos($this->_agent, 'lynx') !== false) {
1349 $aresult = explode('/', stristr($this->_agent, 'Lynx'));
1350 $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : ""));
1351 $this->setVersion($aversion[0]);
1352 $this->setBrowser(self::BROWSER_LYNX);
1353 return true;
1354 }
1355 return false;
1356 }
1357
1358 /**
1359 * Determine if the browser is Amaya or not (last updated 1.7)
1360 * @return boolean True if the browser is Amaya otherwise false
1361 */
1362 protected function checkBrowserAmaya()
1363 {
1364 if (stripos($this->_agent, 'amaya') !== false) {
1365 $aresult = explode('/', stristr($this->_agent, 'Amaya'));
1366 if (isset($aresult[1])) {
1367 $aversion = explode(' ', $aresult[1]);
1368 $this->setVersion($aversion[0]);
1369 $this->setBrowser(self::BROWSER_AMAYA);
1370 return true;
1371 }
1372 }
1373 return false;
1374 }
1375
1376 /**
1377 * Determine if the browser is Safari or not (last updated 1.7)
1378 * @return boolean True if the browser is Safari otherwise false
1379 */
1380 protected function checkBrowserSafari()
1381 {
1382 if (stripos($this->_agent, 'Safari') !== false
1383 && stripos($this->_agent, 'iPhone') === false
1384 && stripos($this->_agent, 'iPod') === false
1385 ) {
1386
1387 $aresult = explode('/', stristr($this->_agent, 'Version'));
1388 if (isset($aresult[1])) {
1389 $aversion = explode(' ', $aresult[1]);
1390 $this->setVersion($aversion[0]);
1391 } else {
1392 $this->setVersion(self::VERSION_UNKNOWN);
1393 }
1394 $this->setBrowser(self::BROWSER_SAFARI);
1395 return true;
1396 }
1397 return false;
1398 }
1399
1400 protected function checkBrowserSamsung()
1401 {
1402 if (stripos($this->_agent, 'SamsungBrowser') !== false) {
1403
1404 $aresult = explode('/', stristr($this->_agent, 'SamsungBrowser'));
1405 if (isset($aresult[1])) {
1406 $aversion = explode(' ', $aresult[1]);
1407 $this->setVersion($aversion[0]);
1408 } else {
1409 $this->setVersion(self::VERSION_UNKNOWN);
1410 }
1411 $this->setBrowser(self::BROWSER_SAMSUNG);
1412 return true;
1413 }
1414 return false;
1415 }
1416
1417 protected function checkBrowserSilk()
1418 {
1419 if (stripos($this->_agent, 'Silk') !== false) {
1420 $aresult = explode('/', stristr($this->_agent, 'Silk'));
1421 if (isset($aresult[1])) {
1422 $aversion = explode(' ', $aresult[1]);
1423 $this->setVersion($aversion[0]);
1424 } else {
1425 $this->setVersion(self::VERSION_UNKNOWN);
1426 }
1427 $this->setBrowser(self::BROWSER_SILK);
1428 return true;
1429 }
1430 return false;
1431 }
1432
1433 protected function checkBrowserIframely()
1434 {
1435 if (stripos($this->_agent, 'Iframely') !== false) {
1436 $aresult = explode('/', stristr($this->_agent, 'Iframely'));
1437 if (isset($aresult[1])) {
1438 $aversion = explode(' ', $aresult[1]);
1439 $this->setVersion($aversion[0]);
1440 } else {
1441 $this->setVersion(self::VERSION_UNKNOWN);
1442 }
1443 $this->setBrowser(self::BROWSER_I_FRAME);
1444 return true;
1445 }
1446 return false;
1447 }
1448
1449 protected function checkBrowserCocoa()
1450 {
1451 if (stripos($this->_agent, 'CocoaRestClient') !== false) {
1452 $aresult = explode('/', stristr($this->_agent, 'CocoaRestClient'));
1453 if (isset($aresult[1])) {
1454 $aversion = explode(' ', $aresult[1]);
1455 $this->setVersion($aversion[0]);
1456 } else {
1457 $this->setVersion(self::VERSION_UNKNOWN);
1458 }
1459 $this->setBrowser(self::BROWSER_COCOA);
1460 return true;
1461 }
1462 return false;
1463 }
1464
1465 /**
1466 * Detect if URL is loaded from FacebookExternalHit
1467 * @return boolean True if it detects FacebookExternalHit otherwise false
1468 */
1469 protected function checkFacebookExternalHit()
1470 {
1471 if (stristr($this->_agent, 'FacebookExternalHit')) {
1472 $this->setRobot(true);
1473 $this->setFacebook(true);
1474 return true;
1475 }
1476 return false;
1477 }
1478
1479 /**
1480 * Detect if URL is being loaded from internal Facebook browser
1481 * @return boolean True if it detects internal Facebook browser otherwise false
1482 */
1483 protected function checkForFacebookIos()
1484 {
1485 if (stristr($this->_agent, 'FBIOS')) {
1486 $this->setFacebook(true);
1487 return true;
1488 }
1489 return false;
1490 }
1491
1492 /**
1493 * Detect Version for the Safari browser on iOS devices
1494 * @return boolean True if it detects the version correctly otherwise false
1495 */
1496 protected function getSafariVersionOnIos()
1497 {
1498 $aresult = explode('/', stristr($this->_agent, 'Version'));
1499 if (isset($aresult[1])) {
1500 $aversion = explode(' ', $aresult[1]);
1501 $this->setVersion($aversion[0]);
1502 return true;
1503 }
1504 return false;
1505 }
1506
1507 /**
1508 * Detect Version for the Chrome browser on iOS devices
1509 * @return boolean True if it detects the version correctly otherwise false
1510 */
1511 protected function getChromeVersionOnIos()
1512 {
1513 $aresult = explode('/', stristr($this->_agent, 'CriOS'));
1514 if (isset($aresult[1])) {
1515 $aversion = explode(' ', $aresult[1]);
1516 $this->setVersion($aversion[0]);
1517 $this->setBrowser(self::BROWSER_CHROME);
1518 return true;
1519 }
1520 return false;
1521 }
1522
1523 /**
1524 * Determine if the browser is iPhone or not (last updated 1.7)
1525 * @return boolean True if the browser is iPhone otherwise false
1526 */
1527 protected function checkBrowseriPhone()
1528 {
1529 if (stripos($this->_agent, 'iPhone') !== false) {
1530 $this->setVersion(self::VERSION_UNKNOWN);
1531 $this->setBrowser(self::BROWSER_IPHONE);
1532 $this->getSafariVersionOnIos();
1533 $this->getChromeVersionOnIos();
1534 $this->checkForFacebookIos();
1535 $this->setMobile(true);
1536 return true;
1537
1538 }
1539 return false;
1540 }
1541
1542 /**
1543 * Determine if the browser is iPad or not (last updated 1.7)
1544 * @return boolean True if the browser is iPad otherwise false
1545 */
1546 protected function checkBrowseriPad()
1547 {
1548 if (stripos($this->_agent, 'iPad') !== false) {
1549 $this->setVersion(self::VERSION_UNKNOWN);
1550 $this->setBrowser(self::BROWSER_IPAD);
1551 $this->getSafariVersionOnIos();
1552 $this->getChromeVersionOnIos();
1553 $this->checkForFacebookIos();
1554 $this->setTablet(true);
1555 return true;
1556 }
1557 return false;
1558 }
1559
1560 /**
1561 * Determine if the browser is iPod or not (last updated 1.7)
1562 * @return boolean True if the browser is iPod otherwise false
1563 */
1564 protected function checkBrowseriPod()
1565 {
1566 if (stripos($this->_agent, 'iPod') !== false) {
1567 $this->setVersion(self::VERSION_UNKNOWN);
1568 $this->setBrowser(self::BROWSER_IPOD);
1569 $this->getSafariVersionOnIos();
1570 $this->getChromeVersionOnIos();
1571 $this->checkForFacebookIos();
1572 $this->setMobile(true);
1573 return true;
1574 }
1575 return false;
1576 }
1577
1578 /**
1579 * Determine if the browser is Android or not (last updated 1.7)
1580 * @return boolean True if the browser is Android otherwise false
1581 */
1582 protected function checkBrowserAndroid()
1583 {
1584 if (stripos($this->_agent, 'Android') !== false) {
1585 $aresult = explode(' ', stristr($this->_agent, 'Android'));
1586 if (isset($aresult[1])) {
1587 $aversion = explode(' ', $aresult[1]);
1588 $this->setVersion($aversion[0]);
1589 } else {
1590 $this->setVersion(self::VERSION_UNKNOWN);
1591 }
1592 if (stripos($this->_agent, 'Mobile') !== false) {
1593 $this->setMobile(true);
1594 } else {
1595 $this->setTablet(true);
1596 }
1597 $this->setBrowser(self::BROWSER_ANDROID);
1598 return true;
1599 }
1600 return false;
1601 }
1602
1603 /**
1604 * Determine if the browser is Vivaldi
1605 * @return boolean True if the browser is Vivaldi otherwise false
1606 */
1607 protected function checkBrowserVivaldi()
1608 {
1609 if (stripos($this->_agent, 'Vivaldi') !== false) {
1610 $aresult = explode('/', stristr($this->_agent, 'Vivaldi'));
1611 if (isset($aresult[1])) {
1612 $aversion = explode(' ', $aresult[1]);
1613 $this->setVersion($aversion[0]);
1614 $this->setBrowser(self::BROWSER_VIVALDI);
1615 return true;
1616 }
1617 }
1618 return false;
1619 }
1620
1621 /**
1622 * Determine if the browser is Yandex
1623 * @return boolean True if the browser is Yandex otherwise false
1624 */
1625 protected function checkBrowserYandex()
1626 {
1627 if (stripos($this->_agent, 'YaBrowser') !== false) {
1628 $aresult = explode('/', stristr($this->_agent, 'YaBrowser'));
1629 if (isset($aresult[1])) {
1630 $aversion = explode(' ', $aresult[1]);
1631 $this->setVersion($aversion[0]);
1632 $this->setBrowser(self::BROWSER_YANDEX);
1633
1634 if (stripos($this->_agent, 'iPad') !== false) {
1635 $this->setTablet(true);
1636 } elseif (stripos($this->_agent, 'Mobile') !== false) {
1637 $this->setMobile(true);
1638 } elseif (stripos($this->_agent, 'Android') !== false) {
1639 $this->setTablet(true);
1640 }
1641
1642 return true;
1643 }
1644 }
1645
1646 return false;
1647 }
1648
1649 /**
1650 * Determine if the browser is a PlayStation
1651 * @return boolean True if the browser is PlayStation otherwise false
1652 */
1653 protected function checkBrowserPlayStation()
1654 {
1655 if (stripos($this->_agent, 'PlayStation ') !== false) {
1656 $aresult = explode(' ', stristr($this->_agent, 'PlayStation '));
1657 $this->setBrowser(self::BROWSER_PLAYSTATION);
1658 if (isset($aresult[0])) {
1659 $aversion = explode(')', $aresult[2]);
1660 $this->setVersion($aversion[0]);
1661 if (stripos($this->_agent, 'Portable)') !== false || stripos($this->_agent, 'Vita') !== false) {
1662 $this->setMobile(true);
1663 }
1664 return true;
1665 }
1666 }
1667 return false;
1668 }
1669
1670 /**
1671 * Determine the user's platform (last updated 2.0)
1672 */
1673 protected function checkPlatform()
1674 {
1675 if (stripos($this->_agent, 'windows') !== false) {
1676 $this->_platform = self::PLATFORM_WINDOWS;
1677 } else if (stripos($this->_agent, 'iPad') !== false) {
1678 $this->_platform = self::PLATFORM_IPAD;
1679 } else if (stripos($this->_agent, 'iPod') !== false) {
1680 $this->_platform = self::PLATFORM_IPOD;
1681 } else if (stripos($this->_agent, 'iPhone') !== false) {
1682 $this->_platform = self::PLATFORM_IPHONE;
1683 } elseif (stripos($this->_agent, 'mac') !== false) {
1684 $this->_platform = self::PLATFORM_APPLE;
1685 } elseif (stripos($this->_agent, 'android') !== false) {
1686 $this->_platform = self::PLATFORM_ANDROID;
1687 } elseif (stripos($this->_agent, 'Silk') !== false) {
1688 $this->_platform = self::PLATFORM_FIRE_OS;
1689 } elseif (stripos($this->_agent, 'linux') !== false && stripos($this->_agent, 'SMART-TV') !== false ) {
1690 $this->_platform = self::PLATFORM_LINUX .'/'.self::PLATFORM_SMART_TV;
1691 } elseif (stripos($this->_agent, 'linux') !== false) {
1692 $this->_platform = self::PLATFORM_LINUX;
1693 } else if (stripos($this->_agent, 'Nokia') !== false) {
1694 $this->_platform = self::PLATFORM_NOKIA;
1695 } else if (stripos($this->_agent, 'BlackBerry') !== false) {
1696 $this->_platform = self::PLATFORM_BLACKBERRY;
1697 } elseif (stripos($this->_agent, 'FreeBSD') !== false) {
1698 $this->_platform = self::PLATFORM_FREEBSD;
1699 } elseif (stripos($this->_agent, 'OpenBSD') !== false) {
1700 $this->_platform = self::PLATFORM_OPENBSD;
1701 } elseif (stripos($this->_agent, 'NetBSD') !== false) {
1702 $this->_platform = self::PLATFORM_NETBSD;
1703 } elseif (stripos($this->_agent, 'OpenSolaris') !== false) {
1704 $this->_platform = self::PLATFORM_OPENSOLARIS;
1705 } elseif (stripos($this->_agent, 'SunOS') !== false) {
1706 $this->_platform = self::PLATFORM_SUNOS;
1707 } elseif (stripos($this->_agent, 'OS\/2') !== false) {
1708 $this->_platform = self::PLATFORM_OS2;
1709 } elseif (stripos($this->_agent, 'BeOS') !== false) {
1710 $this->_platform = self::PLATFORM_BEOS;
1711 } elseif (stripos($this->_agent, 'win') !== false) {
1712 $this->_platform = self::PLATFORM_WINDOWS;
1713 } elseif (stripos($this->_agent, 'Playstation') !== false) {
1714 $this->_platform = self::PLATFORM_PLAYSTATION;
1715 } elseif (stripos($this->_agent, 'Roku') !== false) {
1716 $this->_platform = self::PLATFORM_ROKU;
1717 } elseif (stripos($this->_agent, 'iOS') !== false) {
1718 $this->_platform = self::PLATFORM_IPHONE . '/' . self::PLATFORM_IPAD;
1719 } elseif (stripos($this->_agent, 'tvOS') !== false) {
1720 $this->_platform = self::PLATFORM_APPLE_TV;
1721 } elseif (stripos($this->_agent, 'curl') !== false) {
1722 $this->_platform = self::PLATFORM_TERMINAL;
1723 } elseif (stripos($this->_agent, 'CrOS') !== false) {
1724 $this->_platform = self::PLATFORM_CHROME_OS;
1725 } elseif (stripos($this->_agent, 'okhttp') !== false) {
1726 $this->_platform = self::PLATFORM_JAVA_ANDROID;
1727 } elseif (stripos($this->_agent, 'PostmanRuntime') !== false) {
1728 $this->_platform = self::PLATFORM_POSTMAN;
1729 } elseif (stripos($this->_agent, 'Iframely') !== false) {
1730 $this->_platform = self::PLATFORM_I_FRAME;
1731 }
1732 }
1733 }