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

<?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;
}
}