PHP 4 на практике

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


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


    Содержание раздела