Лабы
Физика

Черчение

Лекции
Задачи
Проект: идентификация браузера

Каждый программист, пытающийся создать удобный 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); Soperating_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) для конкретных операционной системы и браузера.

Итоги

В этой главе был изложен довольно обширный материал. Какой прок от языка программирования, если в нем нельзя работать с текстом? Мы рассмотрели следующие темы:

общие сведения о регулярных выражениях в стилях POSIX и Perl;
стандартные функции РНР для работы с регулярными выражениями;
изменение длины строки;
определение длины строки;
альтернативные функции РНР для обработки строковой информации;
преобразование простого текста в HTML и наоборот;
изменение регистра символов в строках.
Следующая глава открывает вторую часть книги - кстати, мою любимую. В ней мы начнем знакомиться со средствами РНР, ориентированными на Web, рассмотрим процесс динамического создания содержимого, включение файлов и построение общих шаблонов. В дальнейших главах части 2 рассматриваются работа с формами HTML, базы данных, отслеживание данных сеанса и нетривиальные средства работы с шаблонами. Держитесь - начинается самое интересное!

Электротехника