Скрипт для визначення браузера користувача на PHP
Нещодавно для одного цікавого проекту мені потрібно було зробити визначення браузера та його версії на PHP. Шаблон був адаптивний (чуйний), і треба було підлаштувати під різні браузери виведення елементів сторінки. Сайт я писав на улюбленому движку 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
Опера/9,80 (Windows NT 5.1; U; ru) Presto/2.6.30 Версія/10.61
Опера приготувала нам підлянку: назва браузера на початку, версія, як це не дивно, в кінці.
Safari 5.1
Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) AppleWebKit/533.17.8 (KHTML, like Gecko) Версія/5.0.1 Safari/533.17.8
Safari теж дивує: через слеш йде зовсім не номер версії. Номер версії йде трохи раніше.
Chrome 6.0.427.0
Mozilla/5.0 (Windows; U; Windows NT 5.1; в США) 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.