PHP

Скрипт для определения браузера пользователя на 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.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 случаев нас спасёт следующее регулярное выражение:
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


А здесь вы можете проверить работу функций в своём браузере.
Надеюсь, что эти функции будут кому-то полезны.
Удачи.
Добавлено: 23 Августа 2013 01:02:37 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...