Blog. Just Blog

Определение мобильных браузеров на PHP

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
С быстрым развитием рынка мобильных устройств становится актуальной тема создания сайтов для них. Это могут быть самостоятельные страницы сайтов, или же просто облегченные версии страниц с минимумом графики, особыми стилями, версткой, чтобы сайт можно было комфортно просматривать на маленьком экранчике мобильного телефона или КПК. И лучше делать это автоматически, не заставляя пользователя искать на основном сайте какие-то дополнительные ссылки. Например, если вы откроете с мобильного телефона любую страницу моего сайта, то вас автоматически переадресует на облегченную версию этой же страницы для мобильных устройств. Определять браузер средствами PHP мы уже умеем, главная сложность - выделить сигнатуры браузеров мобильных устройств. К счастью, это уже сделано на сайте Detect Mobile Browsers. Весь сайт целиком посвящен только одному скрипту для определения мобильных браузеров, но сам скрипт обвешан ненужными наворотами и написан каким-то жутким стилем, так что в исходном виде практически бесполезен. А вот позаимствовать из него сигнатуры и некоторые другие методы определения вполне можно, что и было сделано. Код полностью вычищен и оптимизирован.
  1. //--------------------------------------------------------------------
  2. // Функция проверки принадлежит ли браузер к мобильным устройствам
  3. // Возвращает 0 - браузер стационарный или определить его не удалось
  4. //            1-4 - браузер запущен на мобильном устройстве
  5. //--------------------------------------------------------------------
  6. function is_mobile() {
  7.   $user_agent=strtolower(getenv('HTTP_USER_AGENT'));
  8.   $accept=strtolower(getenv('HTTP_ACCEPT'));
  9.  
  10.   if ((strpos($accept,'text/vnd.wap.wml')!==false) ||
  11.       (strpos($accept,'application/vnd.wap.xhtml+xml')!==false)) {
  12.     return 1// Мобильный браузер обнаружен по HTTP-заголовкам
  13.   }
  14.  
  15.   if (isset($_SERVER['HTTP_X_WAP_PROFILE']) ||
  16.       isset($_SERVER['HTTP_PROFILE'])) {
  17.     return 2// Мобильный браузер обнаружен по установкам сервера
  18.   }
  19.  
  20.   if (preg_match('/(mini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|'.
  21.     'wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|'.
  22.     'lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|'.
  23.     'mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|'.
  24.     'm881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|'.
  25.     'r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|'.
  26.     'i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|'.
  27.     'htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|'.
  28.     'sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|'.
  29.     'p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|'.
  30.     '_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|'.
  31.     's800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|'.
  32.     'd736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |'.
  33.     'sonyericsson|samsung|240x|x320vx10|nokia|sony cmd|motorola|'.
  34.     'up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|'.
  35.     'pocket|kindle|mobile|psp|treo|android|iphone|ipod|webos|wp7|wp8|'.
  36.     'fennec|blackberry|htc_|opera m|windowsphone)/'$user_agent)) {
  37.     return 3// Мобильный браузер обнаружен по сигнатуре User Agent
  38.   }
  39.  
  40.   if (in_array(substr($user_agent,0,4),
  41.     Array("1207""3gso""4thp""501i""502i""503i""504i""505i""506i",
  42.           "6310""6590""770s""802s""a wa""abac""acer""acoo""acs-",
  43.           "aiko""airn""alav""alca""alco""amoi""anex""anny""anyw",
  44.           "aptu""arch""argo""aste""asus""attw""au-m""audi""aur ",
  45.           "aus ""avan""beck""bell""benq""bilb""bird""blac""blaz",
  46.           "brew""brvw""bumb""bw-n""bw-u""c55/""capi""ccwa""cdm-",
  47.           "cell""chtm""cldc""cmd-""cond""craw""dait""dall""dang",
  48.           "dbte""dc-s""devi""dica""dmob""doco""dopo""ds-d""ds12",
  49.           "el49""elai""eml2""emul""eric""erk0""esl8""ez40""ez60",
  50.           "ez70""ezos""ezwa""ezze""fake""fetc""fly-""fly_""g-mo",
  51.           "g1 u""g560""gene""gf-5""go.w""good""grad""grun""haie",
  52.           "hcit""hd-m""hd-p""hd-t""hei-""hiba""hipt""hita""hp i",
  53.           "hpip""hs-c""htc ""htc-""htc_""htca""htcg""htcp""htcs",
  54.           "htct""http""huaw""hutc""i-20""i-go""i-ma""i230""iac",
  55.           "iac-""iac/""ibro""idea""ig01""ikom""im1k""inno""ipaq",
  56.           "iris""jata""java""jbro""jemu""jigs""kddi""keji""kgt",
  57.           "kgt/""klon""kpt ""kwc-""kyoc""kyok""leno""lexi""lg g",
  58.           "lg-a""lg-b""lg-c""lg-d""lg-f""lg-g""lg-k""lg-l""lg-m",
  59.           "lg-o""lg-p""lg-s""lg-t""lg-u""lg-w""lg/k""lg/l""lg/u",
  60.           "lg50""lg54""lge-""lge/""libw""lynx""m-cr""m1-w""m3ga",
  61.           "m50/""mate""maui""maxo""mc01""mc21""mcca""medi""merc",
  62.           "meri""midp""mio8""mioa""mits""mmef""mo01""mo02""mobi",
  63.           "mode""modo""mot ""mot-""moto""motv""mozz""mt50""mtp1",
  64.           "mtv ""mwbp""mywa""n100""n101""n102""n202""n203""n300",
  65.           "n302""n500""n502""n505""n700""n701""n710""nec-""nem-",
  66.           "neon""netf""newg""newt""nok6""noki""nzph""o2 x""o2-x",
  67.           "o2im""opti""opwv""oran""owg1""p800""palm""pana""pand",
  68.           "pant""pdxg""pg-1""pg-2""pg-3""pg-6""pg-8""pg-c""pg13",
  69.           "phil""pire""play""pluc""pn-2""pock""port""pose""prox",
  70.           "psio""pt-g""qa-a""qc-2""qc-3""qc-5""qc-7""qc07""qc12",
  71.           "qc21""qc32""qc60""qci-""qtek""qwap""r380""r600""raks",
  72.           "rim9""rove""rozo""s55/""sage""sama""samm""sams""sany",
  73.           "sava""sc01""sch-""scoo""scp-""sdk/""se47""sec-""sec0",
  74.           "sec1""semc""send""seri""sgh-""shar""sie-""siem""sk-0",
  75.           "sl45""slid""smal""smar""smb3""smit""smt5""soft""sony",
  76.           "sp01""sph-""spv ""spv-""sy01""symb""t-mo""t218""t250",
  77.           "t600""t610""t618""tagt""talk""tcl-""tdg-""teli""telm",
  78.           "tim-""topl""tosh""treo""ts70""tsm-""tsm3""tsm5""tx-9",
  79.           "up.b""upg1""upsi""utst""v400""v750""veri""virg""vite",
  80.           "vk-v""vk40""vk50""vk52""vk53""vm40""voda""vulc""vx52",
  81.           "vx53""vx60""vx61""vx70""vx80""vx81""vx83""vx85""vx98",
  82.           "w3c ""w3c-""wap-""wapa""wapi""wapj""wapm""wapp""wapr",
  83.           "waps""wapt""wapu""wapv""wapy""webc""whit""wig ""winc",
  84.           "winw""wmlb""wonu""x700""xda-""xda2""xdag""yas-""your",
  85.           "zeto""zte-"))) {
  86.     return 4// Мобильный браузер обнаружен по сигнатуре User Agent
  87.   }
  88.  
  89.   return false// Мобильный браузер не обнаружен
  90. }
Функция возвращает false, если браузер стационарный или по каким-то причинам его не удалось определить. Если браузер запущен на мобильном устройстве, то результат будет от 1 до 4, это код метода, которым он был определен. Сигнатуры на сайте время от времени пополняются, так что можете брать их оттуда самостоятельно и дополнять эту функцию.

Поделиться ссылкой ВКонтакте
Просмотров: 34475 | Комментариев: 14

Метки: PHP, браузеры
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (21.08.2018 в 14:07):
Качаем скрипт без доната: https://href.li/?https://detec...e_detect.zip
ManHunter (09.05.2013 в 12:51):
За три года информация немного устарела, поэтому добавил в скрипт всякие андроиды и прочие новинки. Камменты закрыл, т.к. надоело.
ManHunter (10.02.2012 в 11:12):
Если посмотришь повнимательнее, то увидишь, что определение выполняется не по конкретным моделям, а по сигнатурам их мобильных браузеров, а также по характерным заголовкам запросов. Эти данные у производителей могут не меняться вообще никогда.
Alex (09.02.2012 в 20:45):
К автору. Модели мобильных девайсов появляются и умирают чуть ли не каждую неделю. С 30.04.2010 список остается актуальным?
yun (23.01.2012 в 22:23):
Соглашусь с ManHunter, но не в том плане что надо изобретать велосипеды, а в том что проекты надо писать не на 3 недели. Если есть открытый проект, да еще желательно устанавливаемый локально - замечательно, почему не использовать.
Но если этот "проект" - закрытая разработка какой-то коммерческой фирмы, да еще и полностью закрытая, да работающая с их серверов... Я не буду вспоминать что и яндекс недавно лежал пару часов и гугль. Так же я опущу что данные о клиентах не всегда правильно слать в сторонние сервисы. Но кто даст гарантию что завтра яндекс не закроет сервис? Тем более что организовать альтернативу не так уж сложно.
Я уж молчу про откуда-то взявшееся мнение что в яндексе такие профессионалы. С чего вы это взяли?! Их бот при индексации по сайтмапу в конце слеш отбрасывает. Где гарантия что еще где-то не налажали?
ManHunter (13.01.2012 в 08:33):
akurganow, ты видимо думаешь, что лопаты в магазине и у соседа появились сами собой? Так вот не удивляйся, когда на очередной лопате ты обнаружишь мою маркировку. А настоящая разница между нами в том, что я веду проекты, под которые нет и никогда не будет лопат, а ты сидишь на фрилансе и пукаешь в кулачок в ожидании очередного заказа на "создание" сайта на соседской джумле и магазинском шаблоне. У тебя даже не хватило ума привести достойный аргумент, ты просто взял и спиздил цитату с башорга, выдав за свою мудрую мысль. Это только подтверждает мой вывод.
akurganow (13.01.2012 в 02:46):
ManHunter, Знаешь в чем разница между мной и тобой, предположим гипотетическую ситуацию, нас просят выкопать яму, ты, из-за гордости, изучаешь добычу и обогащение полезных ископаемых, выплавку железосодержащих материалов, ковку, плотницкое дело, добываешь и обогащаешь железную руду, выплавляешь заготовку, куешь лопату, срубаешь дерево, изготавливаешь черенок, собираешь лопату и с матами, в виду низкого качества инструмента, выкапываешь яму. Я же в свою очередь иду в магазин или к соседу, покупаю/беру на время лопату и копаю яму.
Достаточно понятная аналогия?
shomeax (13.11.2011 в 06:56):
ну на wurfl всё-таки гнать не следует. там база признаков устройств очень грамотно реализована. если вам нужно всего лишь для своего домашнего проекта определить, открыли вы страничку своей нокией или с компа мозиллой - да, нет смысла тягать внешние либы, а для серьезного проекта (читай, для проекта, от которого вас могут в определенный момент попросить "передать ключи", причем вовсе не по причинам качества кода), эффективней использовать готовые решения, которые поддерживает большая команда сторонних разработчиков.
Ми (02.06.2011 в 01:22):
Спасибо скрипт работает )
ManHunter (24.05.2011 в 00:20):
Александр, делаешь ссылку на определенную страницу, например, с особым параметром в адресной строке. На этой странице ставишь куку или переменную в сессию, указывающей, что переадресацию на мобильную версию для этого посетителя делать больше не надо. Дальше следует автоматическая переадресация на главную или любую другую страницу полной версии сайта. Как-то так.
Александр (24.05.2011 в 00:14):
А как с мобильного попасть на полную версию (по желанию посетителя)? Через что это можно реализовать?
Юрий (06.09.2010 в 22:56):
Спасибо огромное за статью и за сайт!!!

Очень нужная функция! Как раз, элегантное и красивое решение!
e.lamskoy (26.08.2010 в 23:39):
Весьма скупое решения для реального проекта.
Для общего понимания годится :)
В моей практике пришлось использовать библиотеку WURFL - http://wurfl.sourceforge.net/
Она вдобавок умеет еще и рендерить страницы в зависимости от класса мобильных устройств.
belena (09.06.2010 в 11:48):
спасибо, очень помогло

Добавить комментарий

Заполните форму для добавления комментария
Комментарии отключены администратором сайта
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0063 сек.) / Память: 4.5 Mb
Наверх