Определение браузера на PHP
Головная боль всех профессиональных веб‑разработчиков – отличия внешнего вида html‑страниц в зависимости от браузера. Не будет преувеличением сказать, что каждый, кто занимается версткой, активно ненавидит не любит IE, однако, проблемы встречаются и у других браузеров.
На данный момент в среде верстальщиков правильным считается разделение содержимого страницы и ее оформления. Собственно, HTML содержит только информацию, а ее оформление описывается в CSS.
В связи с тем, что разные браузеры по‑разному интерпретируют инструкции оформления, верстальщики идут на хитрости, используя так называемые хаки – специфические методы написания CSS‑правил, при которых та или иная их (правил) часть воспринимается одним браузером, но не воспринимается другим. Самым знаменитым таким хаком является StarHtmlHack – конструкция, воспринимаемая только IE6:
*html .class {}
Для IE есть множество хаков, но для других браузеров их много меньше.
На мой взгляд гораздо безопаснее определить браузер пользователя и добавить к тегу <body> класс с именем этого браузера и, в отношении IE, его версией. В дальнейшем, в CSS очень легко прописать правила для соответствующего браузера.
Иногда я использую следующую конструкцию:
<body class="<?php
if ( stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox') ) echo 'firefox';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Chrome') ) echo 'chrome';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Safari') ) echo 'safari';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Opera') ) echo 'opera';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0') ) echo 'ie6';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.0') ) echo 'ie7';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 8.0') ) echo 'ie8';
?>">
Далее, в CSS‑файле можно написать что‑то вроде:
.menu li {правила для всех браузеров}
.ie6 .menu li {исправления для IE6}
.opera .menu li {исправления для Opera}
Этот метод ничуть не умаляет других способов: определение браузера средствами JS, использование условных комментариев, «чистых» и «грязных» хаков и пр.
Ничто не мешает использовать $_SERVER['HTTP_USER_AGENT'] для определения только одного проблемного браузера. К примеру, добавление правок только для Firefox 1.x будет выглядеть следующим образом:
<body class="<?php
if ( stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox/1') ) echo 'ff1';
?>">
И потом в CSS:
.ff1 .trouble {}
Удачной верстки! И пусть IE6 скорее умрет!
9 января 2010
Категория: Web–разработка
Комментировать ↓
Комментарии (уже 39)
Ответить
Ответить
согласен, раньше часто меняли.
сейчас, однако, мне сложно представить хоть сколько-нибудь реальную причину, которая может заставить менять строку юзерагента хотя бы 1% пользователей.
п.с.: ранние версии IE специально писали в начале этой строки слово Mozilla, чтобы получать тот вариант страниц, который предназначен для Navigator-а от Netscape.
Ответить
Ответить
нет, на этом сайте такого кода нет.
этот код ничуть не тормозит, выполняется без к-л проблем и очень быстро.
проблемы с загрузкой сайта, скорее всего, были связаны с вашим каналом связи — ранее мне не встречались ни проблемы с загрузкой страниц, ни жалобы на такие проблемы. хотя, может и хостинг, черт его знает.
о частоте встречаемости подмены строки юзер-агента спорить нечего — это, ориентировочно, менее 1% всех, кто пользуется интернетом. ибо мотива подменять эту строку сейчас уже нет.
Ответить
Ответить
как проверяете?
посмотрите что выдает Ваш браузер в строке юзер-агента: echo $_SERVER['HTTP_USER_AGENT'];
Ответить
Firefox 3 выдаёт: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.2) Gecko/2008091620 FileDownloader;fdnet FirePHP/0.2.4
Ответить
Сделал, проверил, работает.)) Спасибо.
Ответить
все-таки, для IE лучше использовать конструкции наподобие
<!--[if IE 7]><link href="css/ie7.css" rel="stylesheet" type="text/css" media="all" /><![endif]-->Ответить
Ответить
Ответить
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.0') ) echo 'ie7';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0') ) echo 'ie6';
надо переставить так т. к. в строчке 8 IE упоминается 6.0
Ответить
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)IE6 не упоминается.
зачем менять местами?
Ответить
function browser($s) {
if(substr($s,0,5) == "Opera")
return "Opera";
if(substr($s,0,7) == "Mozilla")
return "Firefox";
}
echo browser($_SERVER['HTTP_USER_AGENT']);
Ответить
Ответить
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; MRSPUTNIK 2, 2, 0, 94; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)
Как так?
Этот сайт в ие не открывается.
Ответить
у Вас стоит пакет эксплореров — видимо, на родной win XP с ее шестым ишаком, стоит пакет с 7кой и 8кой.
если браузер один (не девелопперские машины), инфа о браузере не дублируется.
да, в шестом говноишаке этот сайт не работает.
Ответить
а
так
статейка очень полезная. спасибо
Ответить
Ответить
Ответить
о функциональности сайтов, в зависимости от браузера — это, конечно, к создателям этих сайтов нужно обращаться.
универсальный ответ на вопрос «что делать» в данном случае таков: используйте хороший современный, распространенный (удобный, быстрый и безопасный) браузер — Firefox или Google Chrome.
Ответить
Спасибо за ответ.Этими браузерами и пользуюсь.Вот про Firefox на некоторых сайтах мне и говорят,что некорректен.В основном работает отлично.Обновлен до последней версии.И когда мне сообщили о некорректности браузера-очень была удивлена.В связи с этим и искала в инете инфу на эту тему.Статья у вас подходящая,конечно.Спасибо.
Ответить
если сайт пишет, что Ваш Firefox 7.0.1 некорректен, сайт — г@вно, автор сайта — муд@к.
Ответить
а скрипт действительно полезный, вообще php гораздо стабильнее и кроссплатформеннее чем html & js так, что может стоит изучить учебник http://d86.ru/g1091476 по php и забыть как страшный сон все костыли и хаки!?
Ответить
Ответить
а скрипт действительно полезный, вообще php гораздо стабильнее и кроссплатформеннее чем html & js так, что может стоит изучить учебник http://d86.ru/g1091476 по php и забыть как страшный сон все костыли и хаки!?
кстати, определить версию броузера можно на js и уже в загрузившейся странице установить класс для тега body
Ответить
Ответить
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) )
поэтому думаю начинать надо с :
if ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE ') ) echo 'ie';
а уже потом все остальные...
Ответить
у Оперы всегда были проблемы с JS.
на данный момент, определение юзерагента, как программистская задача, актуальна, преимущественно для выявления Internet Explorer-ов — медленных дырявых браузеров, не поддерживающих новые возможности веб-разработки.
Ответить
у Вас в системе, видимо, стоит IE6, а IE8 — как часть одного из комплектов IE (IETester, Multiple IE)?
с чего в этом коде начинать — без разницы.
в Вашем варианте IE будет определен без версий, а при попытке определить версию, всегда будет выдаваться 6-ка.
Ответить
<BODY class='<?php
function myfunc1($s) {if(($a=abs($s{0}))>0 || ($a=abs($s{1}))>0) return $a; else return "";}
if(($ss=strstr($s=strtolower($_SERVER['HTTP_USER_AGENT']),"msie"))) echo "ie".myfunc1(substr($ss,4,2));
elseif(($ss=strstr($s,"firefox"))) echo "ff".myfunc1(substr($ss,7,2));
elseif(($ss=strstr($s,"opera"))) echo "op".myfunc1(substr($ss,5,2));
else echo "all";
?>'>
Ответить
думаю, этого не произойдет.
а если и произойдет, сейчас уже есть короткие, эффективные и точные методы определения браузеран а стороне пользователя.
Ответить
Ответить
http://intsystem.org/141/user-browser-detect/
Пишут очень удобный класс для определения браузера. Попробовал - вроде не глючит.
Ответить
Эээээ!!! то что сверху от k313 - я этого не писал! Какой-то лже-k313...
Ответить
=========
if(($s1=stristr($s2=$_SERVER['HTTP_USER_AGENT'],'MSIE'))) {$usag='ie';}
elseif(($s1=stristr($s2,'Chrome'))) {$usag='ch';}
elseif(($s1=stristr($s2,'Opera'))) {$usag='op';}
elseif(($s1=stristr($s2,'Firefox'))) {$usag='ff';}
elseif(($s1=stristr($s2,'Safari'))) {$usag='sf';}
else {$usag='al';$usagver=false;}
if($usag!='al') {if(($s3=stristr($s2,'Version'))) {$usagver=myfunc1($s3);} else {$usagver=myfunc1($s1);}}
function myfunc1($s) {
$arr=array(0,0,0);
for($b=$j=$i=0;($i0) {$j++; $b=0;}}//
return $arr;
}
===========
и кстати статейка, после которой ещё меньше хочется определять user_agent на стороне сервера...
http://webew.ru/articles/1251.webew
Ответить
Version = '.$usagver[0].'.'.$usagver[1].'.'.$usagver[2];
Ответить
======================
может так покажет правильно...
function myfunc1($s) {$arr=array(0,0,0); for($b=$j=$i=0;($i<16 && $j<3);$i++) {if(($a=abs($s{$i}))>0 || $s{$i}==='0') {$arr[$j]=$arr[$j]*pow(10,$b)+$a; $b++;} elseif($b>0) {$j++; $b=0;}} return $arr;}
Ответить