Скрипт для определения браузера пользователя на PHP
Недавно для одного интересного проекта мне потребовалось сделать определение браузера и его версии на PHP. Шаблон был адаптивный (responcive), и надо было подстроить под разные браузеры вывод элементов страницы. Сайт я писал на любимом движке WordPress и тема была сверстана под него. Как всегда недолго думая над задачей полез я в Интернет. Мое было удивление когда я нашел готовый скрипт, который полностью меня устроил в первой десятке выдачи google. Респект и уважуха разработчику и блогеру ко
торый этот скрипт написал и выложил у себя на блоге.
Чем он особо мне понравился, так это тем, что скрипт мог определять браузеры на движке Gecko, а не только основные браузеры (Firefox, Chrome, IE, Opera, Safari), и даже те, которые построены на ядре Trident (Maxthon, Avant Browser, MyIE2), и даже старые версии Оперы, маскирующиеся под IE. Кроме того, скрипт находит и отображает версию браузера.
Автор блога выложил некоторые сведения, которые я также хотел бы выложить себе на сайт.
Теория из слов автора:
Как определяется браузер на PHP?
В PHP есть замечательная переменная под названием $_SERVER[‘HTTP_USER_AGENT’].
У меня, например, она выглядит так:
Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Отсюда вытащить браузер и версию просто, не так ли?
Теперь IE 6
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Здесь уже немного посложнее, но тоже не должно вызывать особых затруднений.
Opera 10.61
Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.6.30 Version/10.61
Опера приготовила нам подлянку: название браузера в начале, а версия, как это не странно, в конце.
Safari 5.1
Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8
Safari тоже удивляет: через слэш идёт вовсе не номер версии. Номер версии идёт чуть раньше.
Chrome 6.0.427.0
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.427.0 Safari/534.1
Хром вытащить легче, хорошо бы ещё не перепутать его с Safari…
(О том, почему все браузеры (кроме Оперы) называют себя Mozilla можно в простой и увлекательной форме почитать здесь.)
Практика из слов автора
Вы уже узнали, какое разнообразие в строке User-agent предлагают всего лишь пять браузеров.
Но в 9 из 10 случаев нас спасёт следующее регулярное выражение:
1 |
preg_match("/(MSIE|Opera|Firefox|Chrome|Version)(?:\/| )([0-9.]+)/", $agent, $browser_info); |
После этого во втором элементе массива будет лежать название браузера, а в третьем — его версия.
Исключение представляет лишь Safari начиная с версии 3.0 и Opera начиная с версии 10.00.
Для этих браузеров мы пишем:
1 2 |
if ($browser == 'Opera' && $version == '9.80') return 'Opera '.substr($agent,-5); // возвращаем версию Оперы в конце строки if ($browser == 'Version') return 'Safari '.$version; // обозначаем браузер как Сафари |
И ещё одна строка кода:
1 |
if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko'; |
Если мы не смогли определить браузер, но знаем, что он использует ядро Gecko, то выводим сообщение о том, что браузер работает на этом ядре.
Вот, в сущности, и всё содержание первой, более компактной функции по определению браузера.
Её код целиком:
1 2 3 4 5 6 7 8 |
function user_min_browser($agent) { preg_match("/(MSIE|Opera|Firefox|Chrome|Version)(?:\/| )([0-9.]+)/", $agent, $browser_info); list(,$browser,$version) = $browser_info; if ($browser == 'Opera' && $version == '9.80') return 'Opera '.substr($agent,-5); if ($browser == 'Version') return 'Safari '.$version; if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko'; return $browser.' '.$version; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function user_browser($agent) { preg_match("/(MSIE|Opera|Firefox|Chrome|Version|Opera Mini|Netscape|Konqueror|SeaMonkey|Camino|Minefield|Iceweasel|K-Meleon|Maxthon)(?:\/| )([0-9.]+)/", $agent, $browser_info); // регулярное выражение, которое позволяет отпределить 90% браузеров list(,$browser,$version) = $browser_info; // получаем данные из массива в переменную if (preg_match("/Opera ([0-9.]+)/i", $agent, $opera)) return 'Opera '.$opera[1]; // определение _очень_старых_ версий Оперы (до 8.50), при желании можно убрать if ($browser == 'MSIE') { // если браузер определён как IE preg_match("/(Maxthon|Avant Browser|MyIE2)/i", $agent, $ie); // проверяем, не разработка ли это на основе IE if ($ie) return $ie[1].' based on IE '.$version; // если да, то возвращаем сообщение об этом return 'IE '.$version; // иначе просто возвращаем IE и номер версии } if ($browser == 'Firefox') { // если браузер определён как Firefox preg_match("/(Flock|Navigator|Epiphany)\/([0-9.]+)/", $agent, $ff); // проверяем, не разработка ли это на основе Firefox if ($ff) return $ff[1].' '.$ff[2]; // если да, то выводим номер и версию } if ($browser == 'Opera' && $version == '9.80') return 'Opera '.substr($agent,-5); // если браузер определён как Opera 9.80, берём версию Оперы из конца строки if ($browser == 'Version') return 'Safari '.$version; // определяем Сафари if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko'; // для неопознанных браузеров проверяем, если они на движке Gecko, и возращаем сообщение об этом return $browser.' '.$version; // для всех остальных возвращаем браузер и версию } |
Примеры работы
В таблице приведён результат работы двух функций — в первом столбце браузер, в котором вызывались функции, во втором — ответ функции, учитывающей малоизвестные браузеры, в третьей — результат работы сокращённой функции.
Браузер | Результат полной функции | Результат сокращённой функц ии |
Firefox 1.5.0.12 | Firefox 1.5.0.12 | Firefox 1.5.0.12 |
Firefox 3.0.10 | Firefox 3.0.10 | Firefox 3.0.10 |
Firefox 3.6.9 | Firefox 3.6.9 | Firefox 3.6.9 |
Firefox 4.0 | Firefox 4.0 | Firefox 4.0 |
IE 4.01 | IE 4.01 | MSIE 4.01 |
IE 5.5 | IE 5.5 | MSIE 5.5 |
IE 6.0 | IE 6.0 | MSIE 6.0 |
IE 7.0 | IE 7.0 | MSIE 7.0 |
IE 8.0 | IE 8.0 | MSIE 8.0 |
Chrome 5.0.375.127 | Chrome 5.0.375.127 | Chrome 5.0.375.127 |
Chromium 6.0.472.36 | Chrome 6.0.472.36 | Chrome 6.0.472.36 |
Chrome 7.0.517.8 | Chrome 7.0.517.8 | Chrome 7.0.517.8 |
Opera 7.03 | Opera 7.03 | MSIE 6.0 |
Opera 8.0 | Opera 8.0 | MSIE 6.0 |
Opera 8.54 | Opera 8.54 | Opera 8.54 |
Opera 9.50 | Opera 9.50 | Opera 9.50 |
Opera 10.00 | Opera 10.00 | Opera 10.00 |
Opera 10.10 | Opera 10.10 | Opera 10.10 |
Opera 10.61 | Opera 10.61 | Opera 10.61 |
Safari 3.0 | Safari 3.0 | Safari 3.0 |
Safari 4.0 | Safari 4.0 | Safari 4.0 |
Safari 5.0.1 | Safari 5.0.1 | Safari 5.0.1 |
Flock 1.2.6 | Flock 1.2.6 | Firefox 2.0.0.17 |
Epiphany 2.22 | Epiphany 2.22 | Firefox 2.0.0.20 |
Navigator 9.0.0.6 | Navigator 9.0.0.6 | Firefox 2.0.0.12 |
Netscape 8.1.3 | Netscape 8.1.3 | Browser based on Gecko |
Konqueror 4.4 | Konqueror 4.4 | Browser based on Gecko |
Galeon 2.0.4 | Browser based on Gecko | Browser based on Gecko |
Iceape 1.1.13 | Browser based on Gecko | Browser based on Gecko |
Iceweasel 3.0.4 | Iceweasel 3.0.4 | Browser based on Gecko |
SeaMonkey 1.1.14 | SeaMonkey 1.1.14 | Browser based on Gecko |
Minefield 3.7 | Minefield 3.7 | Browser based on Gecko |
Avant Browser 7.0 | Avant Browser based on IE 7.0 | MSIE 7.0 |
Camino 2.0.4 | Camino 2.0.4 | Firefox 3.0.19 |
Красным цветом отмечены браузеры, которые функция не смогла определить.
А здесь вы можете проверить работу функций в своём браузере.
Надеюсь, что эти функции будут кому-то полезны.
Удачи.
Скачать скрипт для определения браузера можно у меня:
или на сайте автора:
https://www.recens.ru/php/detect_user_browser.html
Еще раз отдельное спасибо автору!
Определяем мобильные браузеры
Еще из комментариев на сайте автора нашел, как определить мобильные устройстка:
1 2 3 4 5 6 7 8 9 10 11 |
function device() { $user_agent = $this->agent(); // взять USER_AGENT пользователя $oses = array ('Windows 95','Win95','Windows_95', 'Windows 98', 'Win98', 'Windows NT', 'winNT', 'Windows 2000', 'Windows XP', 'winXP', 'Windows ME', 'winME', 'OpenBSD', 'SunOS', 'Linux', 'Mac_PowerPC', 'Macintosh', 'QNX', 'BeOS', 'OS/2'); foreach($oses as $os) { if (substr_count($user_agent, $os) > 0) return 'PC'; } return 'Mobile'; } |
Возвращает mobile или PC, удачи )

/*

- Базовый курс по веб-дизайну;
- Верстка сайтов;
- Общий курс по CMS WordPress и продолжение курса по разработке шаблонов;
- Разработка сайтов на PHP.