Каждый программист, пытающийся создать удобный web-сайт, должен учитывать различия в форматировании страниц при просмотре сайта в разных браузерах и операционных системах. Хотя консорциум W3 (http://www.w3.org) продолжает публиковать стандарты, которых должны придерживаться программисты при создании web-приложений, разработчики браузеров любят дополнять эти стандарты своими маленькими «усовершенствованиями», что в конечном счете вызывает хаос и путаницу. Разработчики часто решают эту проблему, создавая разные страницы для каждого типа браузера и операционной системы — при этом объем работы значительно увеличивается, но зато итоговый сайт идеально подходит для любого пользователя. Результат — хорошая репутация сайта и уверенность в том, что пользователь посетит его снова.
Чтобы пользователь мог просматривать страницу в формате, соответствующем специфике его браузера и операционной системы, из входящего запроса на получение страницы извлекается информация о браузере и платформе. После получения необходимых данных пользователь перенаправляется на нужную страницу.
Приведенный ниже проект (sniffer.php) показывает, как использовать функции РНР для работы с регулярными выражениям с целью получения информации по запросам. Программа определяет тип и версию браузера и операционной системы, после чего выводит полученную информацию в окне браузера. Но прежде чем переходить к непосредственному анализу программы, я хочу представить один из главных ее компонентов — стандартную переменную РНР $HTTP_USER_AGENT. В этой переменной в строковом формате хранятся различные сведения о браузере и операционной системе пользователя — именно то, что нас интересует. Эту информацию можно легко вывести на экран всего одной командой:
<?
echo $HTTP USER_AGENT;
?>
При работе в Internet Explorer 5.0 на компьютере с Windows 98 результат будет выглядеть так:
Mozilla/4.0(compatible; MSIE 5.0; Windows 98; DigExt)
Для Netscape Navigator 4.75 выводятся следующие данные:
Mozilla/4.75(Win98; U)
Sniffer.php извлекает необходимые данные из $HTTP_USER_AGENT при помощи функций обработки строк и регулярных выражений. Алгоритм программы на псевдокоде:
Определить две функции для идентификации браузера и операционной системы: browser_info() и opsys_info(). Начнем с псевдокода функции browser_info().
Определить тип браузера, используя функцию егед(). Хотя эта функция работает медленнее упрощенных строковых функций типа strstr(), в данном случае она удобнее, поскольку регулярное выражение позволяет определить версию браузера.
Воспользоваться конструкцией if/elseif для идентификации следующих браузеров и их версий: Internet Explorer, Opera, Netscape и браузер неизвестного типа.
Вернуть информацию о типе и версии браузера в виде массива.
Функция opsys_info() определяет тип операционной системы. На этот раз используется функция strstr(), поскольку тип ОС определяется и без применения регулярных выражений.
Воспользоваться конструкцией if/elseif для идентификации следующих систем: Windows, Linux, UNIX, Macintosh и неизвестная операционная система.
Вернуть информацию об операционной системе.
Листинг 8.3. Идентификация типа браузера и операционной системы клиента
<?
/*
Файл : sniffer.php
Назначение: Идентификация типа/версии браузера и платформы
Автор: В. Дж. Гилмор
Дата : 24 августа 2000 г.
*/
// Функция: browser_info
// Назначение: Возвращает тип и версию браузера
function browser_info($agent) {
// Определить тип браузера
// Искать сигнатуру Internet Explorer
if(ereg('MSIE([0-9].[0-9]{1,2})', $agent, $version))
$browse_type = "IE";
$browse version = $version[1];
// Искать сигнатуру Opera
elseif(ereg( 'Opera([0-9].[0-9]{1,2})'. $agent, $version)):
$browse_type = "Opera";
$browse_version = $version[1];
// Искать сигнатуру Netscape. Проверка браузера Netscape
// *должна* выполняться после проверки Internet Explorer и Opera,
// поскольку все эти браузеры любят сообщать имя
// Mozilla вместе с настоящим именем.
elseif(ereg( 'Mozilla/([0-9].[0-9]{1,2})'. $agent, $version)) :
$browse_type = "Netscape";
$browse_version = $version[1];
// Если это не Internet Explorer, Opera или Netscape.
// значит, мы обнаружили неизвестный браузер,
else :
$browse_type = "Unknown";
$browse_version = "Unknown";
endif:
// Вернуть тип и версию браузера в виде массива
return array($browse_type, $browse_version);
} // Конец функции browser_info
// Функция: opsys_info
// Назначение: Возвращает информацию об операционной системе пользователя
function opsys_info($agent) {
// Идентифицировать операционную систему
// Искать сигнатуру Windows
if( strstr($agent. 'win') ) :
$opsys = "windows";
// Искать сигнатуру Linux
elseif( strstr($agent, 'Linux') ) :
$opsys = "Linux";
// Искать сигнатуру UNIX
elseif( strstr(Sagent, 'Unix') ) :
$opsys = "Unix";
// Искать сигнатуру Macintosh
elseif( strstr($agent, 'Mac') ) :
$opsys = "Macintosh";
// Неизвестная платформа else :
$opsys = "Unknown";
endif;
// Вернуть информацию об операционной системе
return $opsys;
} // Конец функции opsys_info
// Сохранить возвращаемый массив в списке
list($browse_type, $browse_version) = browser_info($HTTP_USER_AGENT);
$operating_sys = opsysjnfo($HTTP_USER_AGENT);
print "Browser Type: $browse_type <br>";
print "Browser Version: $browse_version <br>";
print "Operating System: $operating_sys <br>";
?>
Вот и все! Например, если пользователь работает в браузере Netscape 4.75 на компьютере с системой Windows, будет выведен следующий результат:
Browser Type: Netscape
Browser Version: 4.75
Operating System: Windows
В следующей главе вы научитесь осуществлять переходы между страницами и даже создавать списки стилей(style sheets) для конкретных операционной системы и браузера.