You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.0 KiB
128 lines
4.0 KiB
<?php |
|
class wfBrowscap { |
|
protected $_cacheLoaded = false; |
|
protected $_userAgents = array(); |
|
protected $_browsers = array(); |
|
protected $_patterns = array(); |
|
protected $_properties = array(); |
|
protected $resultCache = array(); |
|
const COMPRESSION_PATTERN_START = '@'; |
|
const COMPRESSION_PATTERN_DELIMITER = '|'; |
|
const REGEX_DELIMITER = '@'; |
|
|
|
public static function shared() { |
|
static $_browscap = null; |
|
if ($_browscap === null) { |
|
$_browscap = new wfBrowscap(); |
|
} |
|
return $_browscap; |
|
} |
|
|
|
public function getBrowser($user_agent){ |
|
if (!$this->_cacheLoaded) { |
|
if (!$this->_loadCache(dirname(__FILE__) . '/wfBrowscapCache.php')) { |
|
throw new Exception('Cannot load this cache version - the cache format is not compatible.'); |
|
} |
|
} |
|
|
|
$browser = array(); |
|
foreach ($this->_patterns as $pattern => $pattern_data) { |
|
if (preg_match($pattern . 'i', $user_agent, $matches)) { |
|
if (1 == count($matches)) { |
|
$key = $pattern_data; |
|
|
|
$simple_match = true; |
|
} else { |
|
$pattern_data = unserialize($pattern_data); |
|
|
|
array_shift($matches); |
|
|
|
$match_string = self::COMPRESSION_PATTERN_START |
|
. implode(self::COMPRESSION_PATTERN_DELIMITER, $matches); |
|
|
|
if (!isset($pattern_data[$match_string])) { |
|
continue; |
|
} |
|
|
|
$key = $pattern_data[$match_string]; |
|
|
|
$simple_match = false; |
|
} |
|
|
|
$browser = array( |
|
$user_agent, |
|
trim(strtolower($pattern), self::REGEX_DELIMITER), |
|
$this->_pregUnQuote($pattern, $simple_match ? false : $matches) |
|
); |
|
|
|
$browser = $value = $browser + unserialize($this->_browsers[$key]); |
|
|
|
while (array_key_exists(3, $value)) { |
|
$value = unserialize($this->_browsers[$value[3]]); |
|
$browser += $value; |
|
} |
|
|
|
if (!empty($browser[3])) { |
|
$browser[3] = $this->_userAgents[$browser[3]]; |
|
} |
|
|
|
break; |
|
} |
|
} |
|
|
|
$array = array(); |
|
foreach ($browser as $key => $value) { |
|
if ($value === 'true') { |
|
$value = true; |
|
} elseif ($value === 'false') { |
|
$value = false; |
|
} |
|
$array[$this->_properties[$key]] = $value; |
|
} |
|
|
|
return $array; |
|
} |
|
protected function _loadCache($cache_file){ |
|
$cache_version = null; |
|
$source_version = null; |
|
$browsers = array(); |
|
$userAgents = array(); |
|
$patterns = array(); |
|
$properties = array(); |
|
|
|
$this->_cacheLoaded = false; |
|
|
|
require $cache_file; |
|
|
|
$this->_source_version = $source_version; |
|
$this->_browsers = $browsers; |
|
$this->_userAgents = $userAgents; |
|
$this->_patterns = $patterns; |
|
$this->_properties = $properties; |
|
|
|
$this->_cacheLoaded = true; |
|
|
|
return true; |
|
} |
|
protected function _pregUnQuote($pattern, $matches){ |
|
$search = array( |
|
'\\' . self::REGEX_DELIMITER, '\\.', '\\\\', '\\+', '\\[', '\\^', '\\]', '\\$', '\\(', '\\)', '\\{', '\\}', |
|
'\\=', '\\!', '\\<', '\\>', '\\|', '\\:', '\\-', '.*', '.', '\\?' |
|
); |
|
$replace = array( |
|
self::REGEX_DELIMITER, '\\?', '\\', '+', '[', '^', ']', '$', '(', ')', '{', '}', '=', '!', '<', '>', '|', |
|
':', '-', '*', '?', '.' |
|
); |
|
|
|
$result = substr(str_replace($search, $replace, $pattern), 2, -2); |
|
|
|
if ($matches) { |
|
foreach ($matches as $one_match) { |
|
$num_pos = strpos($result, '(\d)'); |
|
$result = substr_replace($result, $one_match, $num_pos, 4); |
|
} |
|
} |
|
|
|
return $result; |
|
} |
|
}
|
|
|