: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
<?php /** @noinspection ALL */
* Author: Chris Schuld (http://chrisschuld.com/)
* Last Modified: April 14th, 2020
* Copyright 2019 Chris Schuld
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, subject to the following
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* $browser = new Browser();
* if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
* echo 'You have FireFox version 2 or greater';
* User Agents Sampled from: http://www.useragentstring.com/
* This implementation is based on the original work from Gary White
* http://apptools.com/phptools/browser/
private $_browser_name = '';
private $_is_aol = false;
private $_is_mobile = false;
private $_is_tablet = false;
private $_is_robot = false;
private $_is_facebook = false;
private $_aol_version = '';
const BROWSER_UNKNOWN = 'unknown';
const VERSION_UNKNOWN = 'unknown';
const BROWSER_OPERA = 'Opera'; // http://www.opera.com/
const BROWSER_OPERA_MINI = 'Opera Mini'; // http://www.opera.com/mini/
const BROWSER_WEBTV = 'WebTV'; // http://www.webtv.net/pc/
const BROWSER_EDGE = 'Edge'; // https://www.microsoft.com/edge
const BROWSER_IE = 'Internet Explorer'; // http://www.microsoft.com/ie/
const BROWSER_POCKET_IE = 'Pocket Internet Explorer'; // http://en.wikipedia.org/wiki/Internet_Explorer_Mobile
const BROWSER_KONQUEROR = 'Konqueror'; // http://www.konqueror.org/
const BROWSER_ICAB = 'iCab'; // http://www.icab.de/
const BROWSER_OMNIWEB = 'OmniWeb'; // http://www.omnigroup.com/applications/omniweb/
const BROWSER_FIREBIRD = 'Firebird'; // http://www.ibphoenix.com/
const BROWSER_FIREFOX = 'Firefox'; // https://www.mozilla.org/en-US/firefox/
const BROWSER_BRAVE = 'Brave'; // https://brave.com/
const BROWSER_PALEMOON = 'Palemoon'; // https://www.palemoon.org/
const BROWSER_ICEWEASEL = 'Iceweasel'; // http://www.geticeweasel.org/
const BROWSER_SHIRETOKO = 'Shiretoko'; // http://wiki.mozilla.org/Projects/shiretoko
const BROWSER_MOZILLA = 'Mozilla'; // http://www.mozilla.com/en-US/
const BROWSER_AMAYA = 'Amaya'; // http://www.w3.org/Amaya/
const BROWSER_LYNX = 'Lynx'; // http://en.wikipedia.org/wiki/Lynx
const BROWSER_SAFARI = 'Safari'; // http://apple.com
const BROWSER_IPHONE = 'iPhone'; // http://apple.com
const BROWSER_IPOD = 'iPod'; // http://apple.com
const BROWSER_IPAD = 'iPad'; // http://apple.com
const BROWSER_CHROME = 'Chrome'; // http://www.google.com/chrome
const BROWSER_ANDROID = 'Android'; // http://www.android.com/
const BROWSER_GOOGLEBOT = 'GoogleBot'; // http://en.wikipedia.org/wiki/Googlebot
const BROWSER_CURL = 'cURL'; // https://en.wikipedia.org/wiki/CURL
const BROWSER_WGET = 'Wget'; // https://en.wikipedia.org/wiki/Wget
const BROWSER_UCBROWSER = 'UCBrowser'; // https://www.ucweb.com/
const BROWSER_YANDEXBOT = 'YandexBot'; // http://yandex.com/bots
const BROWSER_YANDEXIMAGERESIZER_BOT = 'YandexImageResizer'; // http://yandex.com/bots
const BROWSER_YANDEXIMAGES_BOT = 'YandexImages'; // http://yandex.com/bots
const BROWSER_YANDEXVIDEO_BOT = 'YandexVideo'; // http://yandex.com/bots
const BROWSER_YANDEXMEDIA_BOT = 'YandexMedia'; // http://yandex.com/bots
const BROWSER_YANDEXBLOGS_BOT = 'YandexBlogs'; // http://yandex.com/bots
const BROWSER_YANDEXFAVICONS_BOT = 'YandexFavicons'; // http://yandex.com/bots
const BROWSER_YANDEXWEBMASTER_BOT = 'YandexWebmaster'; // http://yandex.com/bots
const BROWSER_YANDEXDIRECT_BOT = 'YandexDirect'; // http://yandex.com/bots
const BROWSER_YANDEXMETRIKA_BOT = 'YandexMetrika'; // http://yandex.com/bots
const BROWSER_YANDEXNEWS_BOT = 'YandexNews'; // http://yandex.com/bots
const BROWSER_YANDEXCATALOG_BOT = 'YandexCatalog'; // http://yandex.com/bots
const BROWSER_SLURP = 'Yahoo! Slurp'; // http://en.wikipedia.org/wiki/Yahoo!_Slurp
const BROWSER_W3CVALIDATOR = 'W3C Validator'; // http://validator.w3.org/
const BROWSER_BLACKBERRY = 'BlackBerry'; // http://www.blackberry.com/
const BROWSER_ICECAT = 'IceCat'; // http://en.wikipedia.org/wiki/GNU_IceCat
const BROWSER_NOKIA_S60 = 'Nokia S60 OSS Browser'; // http://en.wikipedia.org/wiki/Web_Browser_for_S60
const BROWSER_NOKIA = 'Nokia Browser'; // * all other WAP-based browsers on the Nokia Platform
const BROWSER_MSN = 'MSN Browser'; // http://explorer.msn.com/
const BROWSER_MSNBOT = 'MSN Bot'; // http://search.msn.com/msnbot.htm
const BROWSER_BINGBOT = 'Bing Bot'; // http://en.wikipedia.org/wiki/Bingbot
const BROWSER_VIVALDI = 'Vivaldi'; // https://vivaldi.com/
const BROWSER_YANDEX = 'Yandex'; // https://browser.yandex.ua/
const BROWSER_NETSCAPE_NAVIGATOR = 'Netscape Navigator'; // http://browser.netscape.com/ (DEPRECATED)
const BROWSER_GALEON = 'Galeon'; // http://galeon.sourceforge.net/ (DEPRECATED)
const BROWSER_NETPOSITIVE = 'NetPositive'; // http://en.wikipedia.org/wiki/NetPositive (DEPRECATED)
const BROWSER_PHOENIX = 'Phoenix'; // http://en.wikipedia.org/wiki/History_of_Mozilla_Firefox (DEPRECATED)
const BROWSER_PLAYSTATION = "PlayStation";
const BROWSER_SAMSUNG = "SamsungBrowser";
const BROWSER_SILK = "Silk";
const BROWSER_I_FRAME = "Iframely";
const BROWSER_COCOA = "CocoaRestClient";
const PLATFORM_UNKNOWN = 'unknown';
const PLATFORM_WINDOWS = 'Windows';
const PLATFORM_WINDOWS_CE = 'Windows CE';
const PLATFORM_APPLE = 'Apple';
const PLATFORM_LINUX = 'Linux';
const PLATFORM_OS2 = 'OS/2';
const PLATFORM_BEOS = 'BeOS';
const PLATFORM_IPHONE = 'iPhone';
const PLATFORM_IPOD = 'iPod';
const PLATFORM_IPAD = 'iPad';
const PLATFORM_BLACKBERRY = 'BlackBerry';
const PLATFORM_NOKIA = 'Nokia';
const PLATFORM_FREEBSD = 'FreeBSD';
const PLATFORM_OPENBSD = 'OpenBSD';
const PLATFORM_NETBSD = 'NetBSD';
const PLATFORM_SUNOS = 'SunOS';
const PLATFORM_OPENSOLARIS = 'OpenSolaris';
const PLATFORM_ANDROID = 'Android';
const PLATFORM_PLAYSTATION = "Sony PlayStation";
const PLATFORM_ROKU = "Roku";
const PLATFORM_APPLE_TV = "Apple TV";
const PLATFORM_TERMINAL = "Terminal";
const PLATFORM_FIRE_OS = "Fire OS";
const PLATFORM_SMART_TV = "SMART-TV";
const PLATFORM_CHROME_OS = "Chrome OS";
const PLATFORM_JAVA_ANDROID = "Java/Android";
const PLATFORM_POSTMAN = "Postman";
const PLATFORM_I_FRAME = "Iframely";
const OPERATING_SYSTEM_UNKNOWN = 'unknown';
* @param string $userAgent
public function __construct( $userAgent = '' ) {
if ( $userAgent != '' ) {
$this->setUserAgent( $userAgent );
public function reset() {
$this->_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '';
$this->_browser_name = self::BROWSER_UNKNOWN;
$this->_version = self::VERSION_UNKNOWN;
$this->_platform = self::PLATFORM_UNKNOWN;
$this->_os = self::OPERATING_SYSTEM_UNKNOWN;
$this->_is_mobile = false;
$this->_is_tablet = false;
$this->_is_robot = false;
$this->_is_facebook = false;
$this->_aol_version = self::VERSION_UNKNOWN;
* Check to see if the specific browser is valid
* @param string $browserName
* @return bool True if the browser is the specified browser
function isBrowser( $browserName ) {
return ( 0 == strcasecmp( $this->_browser_name, trim( $browserName ) ) );
* The name of the browser. All return types are from the class contants
* @return string Name of the browser
public function getBrowser() {
return $this->_browser_name;
* Set the name of the browser
* @param $browser string The name of the Browser
public function setBrowser( $browser ) {
$this->_browser_name = $browser;
* The name of the platform. All return types are from the class contants
* @return string Name of the browser
public function getPlatform() {
* Set the name of the platform
* @param string $platform The name of the Platform
public function setPlatform( $platform ) {
$this->_platform = $platform;
* The version of the browser.
* @return string Version of the browser (will only contain alpha-numeric characters and a period)
public function getVersion() {
* Set the version of the browser
* @param string $version The version of the Browser
public function setVersion( $version ) {
$this->_version = preg_replace( '/[^0-9,.,a-z,A-Z-]/', '', $version );
* @return string Version of AOL (will only contain alpha-numeric characters and a period)
public function getAolVersion() {
return $this->_aol_version;
* @param string $version The version of AOL
public function setAolVersion( $version ) {
$this->_aol_version = preg_replace( '/[^0-9,.,a-z,A-Z]/', '', $version );
* Is the browser from AOL?
* @return boolean True if the browser is from AOL otherwise false
public function isAol() {
* Is the browser from a mobile device?
* @return boolean True if the browser is from a mobile device otherwise false
public function isMobile() {
return $this->_is_mobile;
* Is the browser from a tablet device?
* @return boolean True if the browser is from a tablet device otherwise false
public function isTablet() {
return $this->_is_tablet;
* Is the browser from a robot (ex Slurp,GoogleBot)?
* @return boolean True if the browser is from a robot otherwise false
public function isRobot() {
* Is the browser from facebook?
* @return boolean True if the browser is from facebook otherwise false
public function isFacebook() {
return $this->_is_facebook;
* Set the browser to be from AOL
public function setAol( $isAol ) {
* Set the Browser to be mobile
* @param boolean $value is the browser a mobile browser or not
protected function setMobile( $value = true ) {
$this->_is_mobile = $value;
* Set the Browser to be tablet
* @param boolean $value is the browser a tablet browser or not
protected function setTablet( $value = true ) {
$this->_is_tablet = $value;
* Set the Browser to be a robot
* @param boolean $value is the browser a robot or not
protected function setRobot( $value = true ) {
$this->_is_robot = $value;
* Set the Browser to be a Facebook request
* @param boolean $value is the browser a robot or not
protected function setFacebook( $value = true ) {
$this->_is_facebook = $value;
* Get the user agent value in use to determine the browser
* @return string The user agent from the HTTP header
public function getUserAgent() {
* Set the user agent value (the construction will use the HTTP header value - this will overwrite it)
* @param string $agent_string The value for the User Agent
public function setUserAgent( $agent_string ) {
$this->_agent = $agent_string;
* Used to determine if the browser is actually "chromeframe"
* @return boolean True if the browser is using chromeframe
public function isChromeFrame() {
return ( strpos( $this->_agent, "chromeframe" ) !== false );
* Returns a formatted string with a summary of the details of the browser.
* @return string formatted string with a summary of the browser
public function __toString() {
return "<strong>Browser Name:</strong> {$this->getBrowser()}<br/>\n" .
"<strong>Browser Version:</strong> {$this->getVersion()}<br/>\n" .
"<strong>Browser User Agent String:</strong> {$this->getUserAgent()}<br/>\n" .
"<strong>Platform:</strong> {$this->getPlatform()}<br/>";
* Protected routine to calculate and determine what the browser is in use (including platform)
protected function determine() {
* Protected routine to determine the browser type
* @return boolean True if the browser was detected otherwise false
protected function checkBrowsers() {
// (1) Opera must be checked before FireFox due to the odd
// user agents used in some older versions of Opera
// (2) WebTV is strapped onto Internet Explorer so we must
// check for WebTV before IE
// (3) (deprecated) Galeon is based on Firefox and needs to be
// tested before Firefox is tested
// (4) OmniWeb is based on Safari so OmniWeb check must occur
// (5) Netscape 9+ is based on Firefox so Netscape checks
// before FireFox are necessary
// (6) Vivaldi is UA contains both Firefox and Chrome so Vivaldi checks
// before Firefox and Chrome
$this->checkBrowserWebTv() ||
$this->checkBrowserBrave() ||
$this->checkBrowserUCBrowser() ||
$this->checkBrowserEdge() ||
$this->checkBrowserInternetExplorer() ||
$this->checkBrowserOpera() ||
$this->checkBrowserGaleon() ||
$this->checkBrowserNetscapeNavigator9Plus() ||
$this->checkBrowserVivaldi() ||
$this->checkBrowserYandex() ||
$this->checkBrowserPalemoon() ||
$this->checkBrowserFirefox() ||
$this->checkBrowserChrome() ||
$this->checkBrowserOmniWeb() ||
$this->checkBrowserAndroid() ||
$this->checkBrowseriPad() ||
$this->checkBrowseriPod() ||
$this->checkBrowseriPhone() ||
$this->checkBrowserBlackBerry() ||
$this->checkBrowserNokia() ||
$this->checkBrowserGoogleBot() ||
$this->checkBrowserMSNBot() ||
$this->checkBrowserBingBot() ||
$this->checkBrowserSlurp() ||
$this->checkBrowserYandexBot() ||
$this->checkBrowserYandexImageResizerBot() ||
$this->checkBrowserYandexBlogsBot() ||
$this->checkBrowserYandexCatalogBot() ||
$this->checkBrowserYandexDirectBot() ||
$this->checkBrowserYandexFaviconsBot() ||
$this->checkBrowserYandexImagesBot() ||
$this->checkBrowserYandexMediaBot() ||
$this->checkBrowserYandexMetrikaBot() ||
$this->checkBrowserYandexNewsBot() ||
$this->checkBrowserYandexVideoBot() ||
$this->checkBrowserYandexWebmasterBot() ||
// check for facebook external hit when loading URL
$this->checkFacebookExternalHit() ||
// WebKit base check (post mobile and others)
$this->checkBrowserSamsung() ||
$this->checkBrowserSilk() ||
$this->checkBrowserSafari() ||
$this->checkBrowserNetPositive() ||
$this->checkBrowserFirebird() ||
$this->checkBrowserKonqueror() ||
$this->checkBrowserIcab() ||
$this->checkBrowserPhoenix() ||
$this->checkBrowserAmaya() ||
$this->checkBrowserLynx() ||
$this->checkBrowserShiretoko() ||
$this->checkBrowserIceCat() ||
$this->checkBrowserIceweasel() ||
$this->checkBrowserW3CValidator() ||
$this->checkBrowserCurl() ||
$this->checkBrowserWget() ||
$this->checkBrowserPlayStation() ||
$this->checkBrowserIframely() ||
$this->checkBrowserCocoa() ||
$this->checkBrowserMozilla() /* Mozilla is such an open standard that you must check it last */ );