Попытка обнаружить браузер пользователя только с PHP, надежный способ $ _SERVER ['HTTP_USER_AGENT']? Должен ли я вместо этого использовать функцию get_browser ? который, по вашему мнению, приносит более точные результаты?
Если этот метод является прагматичным, ему не рекомендуется использовать его для вывода соответствующих ссылок CSS, например:
if(stripos($_SERVER['HTTP_USER_AGENT'],"mozilla")!==false) echo '<link type="text/css" href="mozilla.css" />';
Я заметил этот вопрос , однако я хотел уточнить, хорошо ли это для определения, ориентированного на CSS.
UPDATE: что-то действительно подозрительное: я попробовал echo $_SERVER['HTTP_USER_AGENT'];
на IE 7, и это то, что он выводит:
Mozilla / 4.0 (совместимый MSIE 7.0, Windows NT 6.0, SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)
Сафари тоже дал что-то странное в «мозилле». Что дает?
Использование существующего метода (т.е. get_browser
), вероятно, лучше, чем писать что-то самостоятельно, так как оно имеет (лучше) поддержку и будет обновляться более новыми версиями. Там могут быть также пригодные для использования библиотеки для получения идентификатора браузера надежным способом.
Декодирование $_SERVER['HTTP_USER_AGENT']
затруднено, так как много браузеров имеют весьма похожие данные и имеют тенденцию (неправильно) использовать его для своих собственных преимуществ. Но если вы действительно хотите их декодировать, вы можете использовать информацию на этой странице для всех доступных идентификаторов агентов. Эта страница также показывает, что ваш примерный вывод действительно принадлежит IE 7. Более подробную информацию о полях в самом идентификаторе агента можно найти на этой странице , но, как я уже сказал, браузеры, как правило, используют его для своих собственных преимуществ, и это может быть в (немного) другого формата.
Проверьте этот код, я нашел, что это полезно. Не проверяйте Mozilla, потому что большинство браузеров используют это как строку пользовательского агента
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) echo 'Internet explorer'; elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) //For Supporting IE 11 echo 'Internet explorer'; elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== FALSE) echo 'Mozilla Firefox'; elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) echo 'Google Chrome'; elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== FALSE) echo "Opera Mini"; elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE) echo "Opera"; elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') !== FALSE) echo "Safari"; else echo 'Something else';
class Browser { /** Figure out what browser is used, its version and the platform it is running on. The following code was ported in part from JQuery v1.3.1 */ public static function detect() { $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); // Identify the browser. Check Opera and Safari first in case of spoof. Let Google Chrome be identified as Safari. if (preg_match('/opera/', $userAgent)) { $name = 'opera'; } elseif (preg_match('/webkit/', $userAgent)) { $name = 'safari'; } elseif (preg_match('/msie/', $userAgent)) { $name = 'msie'; } elseif (preg_match('/mozilla/', $userAgent) && !preg_match('/compatible/', $userAgent)) { $name = 'mozilla'; } else { $name = 'unrecognized'; } // What version? if (preg_match('/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches)) { $version = $matches[1]; } else { $version = 'unknown'; } // Running on what platform? if (preg_match('/linux/', $userAgent)) { $platform = 'linux'; } elseif (preg_match('/macintosh|mac os x/', $userAgent)) { $platform = 'mac'; } elseif (preg_match('/windows|win32/', $userAgent)) { $platform = 'windows'; } else { $platform = 'unrecognized'; } return array( 'name' => $name, 'version' => $version, 'platform' => $platform, 'userAgent' => $userAgent ); } } $browser = Browser::detect();
Пользовательский агент может быть фальсифицирован, и его лучше не зависеть от строки агента пользователя, а затем вы можете использовать медиа-запросы CSS3, если хотите только определить ориентацию (вы можете изучить CSS знаменитого адаптивного бутстрапа framework, чтобы проверить, как вы можете обрабатывать ориентационная часть с использованием CSS)
Вот немного CSS:
@media only screen and (max-width: 999px) { /* rules that only apply for canvases narrower than 1000px */ } @media only screen and (device-width: 768px) and (orientation: landscape) { /* rules for iPad in landscape orientation */ } @media only screen and (min-device-width: 320px) and (max-device-width: 480px) { /* iPhone, Android rules here */ }
Подробнее: Об обнаружении ориентации CSS
ИЛИ Вы можете найти ориентацию с помощью JavaScript:
// Listen for orientation changes window.addEventListener("orientationchange", function() { // Announce the new orientation number alert(window.orientation); }, false);
Подробнее: Об обнаружении ориентации с использованием JS
Наконец, если вы действительно хотите пойти с пользовательской строкой, тогда этот код поможет вам много работать почти в каждом браузере:
<?php class BrowserDetection { private $_user_agent; private $_name; private $_version; private $_platform; private $_basic_browser = array ( 'Trident\/7.0' => 'Internet Explorer 11', 'Beamrise' => 'Beamrise', 'Opera' => 'Opera', 'OPR' => 'Opera', 'Shiira' => 'Shiira', 'Chimera' => 'Chimera', 'Phoenix' => 'Phoenix', 'Firebird' => 'Firebird', 'Camino' => 'Camino', 'Netscape' => 'Netscape', 'OmniWeb' => 'OmniWeb', 'Konqueror' => 'Konqueror', 'icab' => 'iCab', 'Lynx' => 'Lynx', 'Links' => 'Links', 'hotjava' => 'HotJava', 'amaya' => 'Amaya', 'IBrowse' => 'IBrowse', 'iTunes' => 'iTunes', 'Silk' => 'Silk', 'Dillo' => 'Dillo', 'Maxthon' => 'Maxthon', 'Arora' => 'Arora', 'Galeon' => 'Galeon', 'Iceape' => 'Iceape', 'Iceweasel' => 'Iceweasel', 'Midori' => 'Midori', 'QupZilla' => 'QupZilla', 'Namoroka' => 'Namoroka', 'NetSurf' => 'NetSurf', 'BOLT' => 'BOLT', 'EudoraWeb' => 'EudoraWeb', 'shadowfox' => 'ShadowFox', 'Swiftfox' => 'Swiftfox', 'Uzbl' => 'Uzbl', 'UCBrowser' => 'UCBrowser', 'Kindle' => 'Kindle', 'wOSBrowser' => 'wOSBrowser', 'Epiphany' => 'Epiphany', 'SeaMonkey' => 'SeaMonkey', 'Avant Browser' => 'Avant Browser', 'Firefox' => 'Firefox', 'Chrome' => 'Google Chrome', 'MSIE' => 'Internet Explorer', 'Internet Explorer' => 'Internet Explorer', 'Safari' => 'Safari', 'Mozilla' => 'Mozilla' ); private $_basic_platform = array( 'windows' => 'Windows', 'iPad' => 'iPad', 'iPod' => 'iPod', 'iPhone' => 'iPhone', 'mac' => 'Apple', 'android' => 'Android', 'linux' => 'Linux', 'Nokia' => 'Nokia', 'BlackBerry' => 'BlackBerry', 'FreeBSD' => 'FreeBSD', 'OpenBSD' => 'OpenBSD', 'NetBSD' => 'NetBSD', 'UNIX' => 'UNIX', 'DragonFly' => 'DragonFlyBSD', 'OpenSolaris' => 'OpenSolaris', 'SunOS' => 'SunOS', 'OS\/2' => 'OS/2', 'BeOS' => 'BeOS', 'win' => 'Windows', 'Dillo' => 'Linux', 'PalmOS' => 'PalmOS', 'RebelMouse' => 'RebelMouse' ); function __construct($ua = '') { if(empty($ua)) { $this->_user_agent = (!empty($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:getenv('HTTP_USER_AGENT')); } else { $this->_user_agent = $ua; } } function detect() { $this->detectBrowser(); $this->detectPlatform(); return $this; } function detectBrowser() { foreach($this->_basic_browser as $pattern => $name) { if( preg_match("/".$pattern."/i",$this->_user_agent, $match)) { $this->_name = $name; // finally get the correct version number $known = array('Version', $pattern, 'other'); $pattern_version = '#(?<browser>' . join('|', $known).')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#'; if (!preg_match_all($pattern_version, $this->_user_agent, $matches)) { // we have no matching number just continue } // see how many we have $i = count($matches['browser']); if ($i != 1) { //we will have two since we are not using 'other' argument yet //see if version is before or after the name if (strripos($this->_user_agent,"Version") < strripos($this->_user_agent,$pattern)){ @$this->_version = $matches['version'][0]; } else { @$this->_version = $matches['version'][1]; } } else { $this->_version = $matches['version'][0]; } break; } } } function detectPlatform() { foreach($this->_basic_platform as $key => $platform) { if (stripos($this->_user_agent, $key) !== false) { $this->_platform = $platform; break; } } } function getBrowser() { if(!empty($this->_name)) { return $this->_name; } } function getVersion() { return $this->_version; } function getPlatform() { if(!empty($this->_platform)) { return $this->_platform; } } function getUserAgent() { return $this->_user_agent; } function getInfo() { 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/>"; } } $obj = new BrowserDetection(); echo $obj->detect()->getInfo();
Вышеприведенный код работает для меня почти в каждом браузере, и я надеюсь, что это поможет вам немного.
if stripos ($ _ SERVER ['HTTP_USER_AGENT'], "mozilla")! == false)
Это не полезный тест, почти каждый браузер идентифицирует себя как Mozilla.
$ _SERVER ['HTTP_USER_AGENT'] надежный способ?
Нет.
Должен ли я вместо этого использовать функцию get_browser?
Нет.
Браузер-обнюхивание на стороне сервера – проигрывающая игра. Помимо всех проблем, связанных с попыткой разбора строки UA, браузеров, которые лежат, неясных браузеров и возможности заголовка не существует вообще, если вы возвращаете другой контент страницы для другого браузера, вы должны установить заголовок Vary
включить User-Agent
, иначе кэширующие прокси могут вернуть неверную версию страницы в неправильный браузер.
Но если вы добавите уязвимый код кэширования IE Vary: User-Agent
запутается и перезагружает страницу каждый раз. Таким образом, вы не можете победить.
Если вы должны использовать браузер, то место, которое нужно сделать, находится на стороне клиента, используя JavaScript и, в частности, в случае IE, условные комментарии. Удачно, что IE поддерживает условные комментарии, так как это тот браузер, для которого вам часто нужны обходные пути. (См. Ответ scunliffe для наиболее распространенной стратегии.)
Старый пост все еще появляется в Google. get_browser () – лучшее решение, но редактирование php.ini может быть невозможно. Согласно этому сообщению вы не можете ini_set свойства броска. Так что же осталось? Кажется, что phpbrowscap выполняет свою работу. Документы невелики, поэтому, если вы не хотите, чтобы он автоматически обновлялся (по умолчанию включено), вам необходимо установить
$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL; $bc->localFile = __DIR__ . "/php_browscap.ini";
Я думаю, что полагаться на userAgent немного слаб, так как он может (и часто) подделываться.
Если вы хотите использовать CSS только для IE, используйте условный комментарий.
<link type="text/css" rel="stylesheet" href="styles.css"/><!--for all--> <!--[if IE]> <link type="text/css" rel="stylesheet" href="ie_styles.css"/> <![endif]-->
или если вы просто хотите его для IE6:
<!--[if IE 6]> <link type="text/css" rel="stylesheet" href="ie6_styles.css"/> <![endif]-->
Поскольку его комментарий игнорируется браузерами … кроме IE, который загружает его, если тест if совпадает с текущим браузером.
Check This Code : <?php class OS_BR{ private $agent = ""; private $info = array(); function __construct(){ $this->agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : NULL; $this->getBrowser(); $this->getOS(); } function getBrowser(){ $browser = array("Navigator" => "/Navigator(.*)/i", "Firefox" => "/Firefox(.*)/i", "Internet Explorer" => "/MSIE(.*)/i", "Google Chrome" => "/chrome(.*)/i", "MAXTHON" => "/MAXTHON(.*)/i", "Opera" => "/Opera(.*)/i", ); foreach($browser as $key => $value){ if(preg_match($value, $this->agent)){ $this->info = array_merge($this->info,array("Browser" => $key)); $this->info = array_merge($this->info,array( "Version" => $this->getVersion($key, $value, $this->agent))); break; }else{ $this->info = array_merge($this->info,array("Browser" => "UnKnown")); $this->info = array_merge($this->info,array("Version" => "UnKnown")); } } return $this->info['Browser']; } function getOS(){ $OS = array("Windows" => "/Windows/i", "Linux" => "/Linux/i", "Unix" => "/Unix/i", "Mac" => "/Mac/i" ); foreach($OS as $key => $value){ if(preg_match($value, $this->agent)){ $this->info = array_merge($this->info,array("Operating System" => $key)); break; } } return $this->info['Operating System']; } function getVersion($browser, $search, $string){ $browser = $this->info['Browser']; $version = ""; $browser = strtolower($browser); preg_match_all($search,$string,$match); switch($browser){ case "firefox": $version = str_replace("/","",$match[1][0]); break; case "internet explorer": $version = substr($match[1][0],0,4); break; case "opera": $version = str_replace("/","",substr($match[1][0],0,5)); break; case "navigator": $version = substr($match[1][0],1,7); break; case "maxthon": $version = str_replace(")","",$match[1][0]); break; case "google chrome": $version = substr($match[1][0],1,10); } return $version; } function showInfo($switch){ $switch = strtolower($switch); switch($switch){ case "browser": return $this->info['Browser']; break; case "os": return $this->info['Operating System']; break; case "version": return $this->info['Version']; break; case "all" : return array($this->info["Version"], $this->info['Operating System'], $this->info['Browser']); break; default: return "Unkonw"; break; } } } $obj = new OS_BR(); echo $obj->showInfo('browser'); echo $obj->showInfo('version'); echo $obj->showInfo('os'); echo "<pre>".print_r($obj->showInfo("all"),true)."</pre>"; ?>