Скрипт для определения браузера пользователя на PHP
Недавно для одного проекта мне потребовалось сделать определение браузера и его версии на PHP.Безуспешно просмотрев десятки устаревших скриптов, я решила написать свой собственный.
Чем он лучше других? Тем, что может определять не только основные браузеры (Firefox, Chrome, IE, Opera, Safari), но и те, которые построены на ядре Trident (Maxthon, Avant Browser, MyIE2) и Gecko (Konqueror, K-Meleon,Flock), и даже старые версии Оперы, маскирующиеся под 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.8Safari тоже удивляет: через слэш идёт вовсе не номер версии. Номер версии идёт чуть раньше.
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 случаев нас спасёт следующее регулярное выражение:
preg_match("/(MSIE|Opera|Firefox|Chrome|Version)(?:\/| )([0-9.]+)/", $agent, $browser_info);
После этого во втором элементе массива будет лежать название браузера, а в третьем — его версия.Исключение представляет лишь Safari начиная с версии 3.0 и Opera начиная с версии 10.00.
Для них мы пишем:
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';Если мы не смогли определить браузер, но знаем, что он использует ядро Gecko, то выводим сообщение о том, что браузер работает на этом ядре.
Вот, в сущности, и всё содержание первой, более компактной функции по определению браузера.
Её код целиком:
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;
}
Вот более полная версия, позволяющая определять экзотические, устаревшие, а также те браузеры, которые построены на основе Firefox и IE:
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 |
Красным цветом отмечены браузеры, которые функция не смогла определить.
А здесь вы можете проверить работу функций в своём браузере.
Надеюсь, что эти функции будут кому-то полезны.
Удачи.



Самое интересное, что функция весьма востребована, а в сети только какието протухшие обрубки валяются. Уже потерял терпение, когда заглянул сюда... И не жалею :)
P.S. Простите за грамматические ошибки, если они есть :)
P. S. Прощать не за что :)
то это значит ??? я ничего не понимаю, но очень нужно понять , могу определить точку доступа ?
5 mesyaca nazad razoshlas' s parnem. Do sih por ne splyu normal'no. Sama seichas v Kitae, a paren' uehal k sebe v Maroko. U menya est' pochta na g-mail. I tam mozhno opredelit' IP- adres s kotorogo zahodili poslednie 10 raz.
Iz 10 polovina stoit moi adres i napisano Kitai, a ostal'nie vot takie :
65.55.41.68,
65.55.41.26,
65.55.41.77
POP3
i vsegda raznie. Zashla na etot sait , opredelyaet USA.
Vopros: Mozhet li bit' adres kak-to zakodirovan, i kakova veroyatnost'. Mozhet li eto bit' na samom dele Maroko ili Angliya.
P.S. Prostite za Chainikovskii vopros:)
@list(,$browser,$version) = $browser_info;
if((string)$browser.(string)$version=='') return 'Other-0';
вылетает на неопределенном браузере
история версий:
upload.wikimedia.org/wikipedia/commons/7/74/Timeline_of_web_browsers.svg
почему все браузеры мозила:
webew.ru/articles/1251.webew