* @date : 3-April-2013 (14-1-1392) * @time : 20:32 * @subpackage TVisitor * @version 1.0 * @todo : TVisitor class for get visitor info */ class TVisitor { function __construct() { } /** * @todo Detect visitor OS * @return int os number */ public static function DetectOSI() { if (!isset($_SERVER['HTTP_USER_AGENT'])) return 0; $os_list = array_values(Visitor::$osList); foreach ($os_list as $index => $match) { if (preg_match("/$match/i", $_SERVER['HTTP_USER_AGENT'])) { return $index + 1; } } return null; } /** * @todo Detect visitor OS * @return string OS name */ public static function DetectOS() { if (!isset($_SERVER['HTTP_USER_AGENT'])) return 'Unknown'; $os_list = Visitor::$osList; foreach ($os_list as $os => $pattern) { if (preg_match("/$pattern/i", $_SERVER['HTTP_USER_AGENT'])) { return $os; } } return 'Unknown'; } /** * @todo Detect if visitor is using a mobile device * @return bool */ public static function IsMobile() { if (!isset($_SERVER['HTTP_USER_AGENT'])) { return false; } $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); // List of mobile devices and operating systems $mobile_agents = [ 'mobile', 'android', 'iphone', 'ipod', 'ipad', 'windows phone', 'blackberry', 'kindle', 'silk', 'opera mini', 'opera mobi', 'webos', 'symbian', 'nokia', 'samsung', 'lg', 'htc', 'mot', 'tablet', 'rim tablet', 'meego', 'netfront', 'bolt', 'fennec', 'series60', 'maemo', 'midp', 'cldc', 'up.browser', 'up.link', 'mmp', 'symbian', 'smartphone', 'wap', ]; // Check if user agent contains any mobile keywords foreach ($mobile_agents as $agent) { if (strpos($user_agent, $agent) !== false) { return true; } } // Check for mobile-specific headers if (isset($_SERVER['HTTP_ACCEPT'])) { if (strpos(strtolower($_SERVER['HTTP_ACCEPT']), 'application/vnd.wap.xhtml+xml') !== false) { return true; } } if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) { return true; } // Check for Opera Mini if (isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])) { return true; } // Use PHP's built-in mobile detection (if available) if (function_exists('http_negotiate_language')) { $accept = http_negotiate_language(['wap', 'html']); if ($accept === 'wap') { return true; } } return false; } /** * @todo Get browser name only * @return string browser name */ public static function DetectBrowser() { if (!isset($_SERVER['HTTP_USER_AGENT'])) return 'Unknown'; $browser_list = Visitor::$browserList; foreach ($browser_list as $browser => $pattern) { if (preg_match("/$pattern/i", $_SERVER['HTTP_USER_AGENT'])) { return $browser; } } return 'Other'; } /** * @todo Get browser name only * @return int browser num */ public static function DetectBrowserI() { if (!isset($_SERVER['HTTP_USER_AGENT'])) return 0; $browser_list = array_values(Visitor::$browserList); foreach ($browser_list as $index => $pattern) { if (preg_match("/$pattern/i", $_SERVER['HTTP_USER_AGENT'])) { return $index + 1; } } return 0; } /** * @todo Find browser version * @return string version */ public static function BrowserVersion() { if (!isset($_SERVER['HTTP_USER_AGENT'])) { return '0'; } $ua = $_SERVER['HTTP_USER_AGENT']; $browser = self::DetectBrowser(); $version = null; switch ($browser) { case 'Edge': if (preg_match('/(Edge|Edg)\/(\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[2]; } break; case 'Chrome': if (preg_match('/Chrome\/(\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[1]; } break; case 'Firefox': if (preg_match('/Firefox\/(\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[1]; } break; case 'Safari': if (preg_match('/Version\/(\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[1]; } break; case 'Opera': if (preg_match('/(OPR|Opera)\/(\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[2]; } break; case 'Internet Explorer': if (preg_match('/MSIE (\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[1]; } elseif (preg_match('/rv:(\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[1]; // For IE 11 } break; default: // Generic version detection for other browsers if (preg_match('/' . preg_quote($browser, '/') . '\/(\d+(\.\d+)*)/', $ua, $matches)) { $version = $matches[1]; } break; } return $version; } /** * Get searched keywords from referrer URL * @param string $referer * @return array|null */ public static function GetKeyword($referer = null) { if ($referer === null) { $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; } if (empty($referer)) { return null; } $engines = Visitor::$engines; $parsed_url = parse_url($referer); $host = isset($parsed_url['host']) ? strtolower($parsed_url['host']) : ''; $query = isset($parsed_url['query']) ? $parsed_url['query'] : ''; parse_str($query, $query_params); foreach ($engines as $engine => $params) { if (strpos($host, $engine) !== false) { foreach ($params as $param) { if (isset($query_params[$param]) && !empty($query_params[$param])) { return [ 'engine' => $engine, 'keyword' => urldecode($query_params[$param]) ]; } } } } return null; } // /** // * @param string $class alternative class // * return vistor os icon // * @uses awesome font // */ // static public function GetOSIcon($class = '') { // // get os // $os_int = self::DetectOSI(); // // $win = range(1, 16); // $linux = range(17, 19); // $osx = array(20, 21); // $android = array(25); // $searchbot = array(27); // $other = array(0, 22, 23, 24, 26); // // switch (true) { // case in_array($os_int, $win): // $icon = 'windows'; // break; // case in_array($os_int, $linux): // $icon = 'linux'; // break; // case in_array($os_int, $osx): // $icon = 'apple'; // break; // // case in_array($os_int, $android): // $icon = 'android'; // break; // // case in_array($os_int, $searchbot): // $icon = 'google'; // break; // default: // $icon = 'question'; // break; // } // // $result = ''; // // return $result; // } // /** // * @param string $class alternative class // * return vistor browser icon // * @uses awesome font // */ // static public function GetBrowerIcon($class = '') { // // get os // $bowser = self::DetectBrowser(); // // // // $result = ''; // return $result; // } }