четверг, 16 сентября 2010 г.

Браузер, как тебя зовут?

В общем, в рамках проекта и желания подсовывать пользователю нужный html5-шаблон – взамен стандартному, пришлось заняться простой с виду задачей – определением агента пользователя – то есть браузера.


Нужно ведь понять, сможет ли браузер отобразить то, что мы хотим показать или придётся прибегать к дополнительным функциям, особенно если страница содержит какую-либо форму или медиа.


Я порылся в Сети и набрёл на небольшую функцию, написанную Джоном Бартлеттом и позже обновленную Дэниелом Харви. Мне пришлось её чуток переписать, так что держите, кому нужно:



public struct function browserDetect()
{
//Что за агент у пользователя?
ua = cgi.HTTP_USER_AGENT;

//В эту структуру мы и сохраним данные
userBrowser = {};
//Мы будем знать название браузера
userBrowser.browserName="";
//Его версию
userBrowser.browserVersion="";
//По умолчанию он не поддерживает HTML5
userBrowser.HTML5support=false;

//Тут около 130 наименований различных браузеров.
//Будет желание — можете дополнить
browsers="1X|Amaya|Ubuntu APT-HTTP|AmigaVoyager|Android|Arachne|Amiga-AWeb|Arora|Bison|Bluefish|Browsex|Camino|Check&Get|Chimera|Chrome|Contiki|cURL|Democracy|Dillo|DocZilla|edbrowse|ELinks|Emacs-W3|Epiphany|Galeon|Minefield|Firebird|Phoenix|Flock|IceApe|IceWeasel|IceCat|Gnuzilla|Google|Google-Sitemaps|HTTPClient|HP Web PrintSmart|IBrowse|iCab|ICE Browser|Kazehakase|KKman|K-Meleon|Konqueror|Links|Lobo|Lynx|Mosaic|SeaMonkey|muCommander|NetPositive|Navigator|NetSurf|OmniWeb|Acorn Browse|Oregano|Prism|retawq|Shiira Safari|Shiretoko|Sleipnir|Songbird|Strata|Sylera|ThunderBrowse|W3CLineMode|WebCapture|WebTV|w3m|Wget|Xenu_Link_Sleuth|Oregano|xChaos_Arachne|WDG_Validator|W3C_Validator|Jigsaw|PLAYSTATION 3|PlayStation Portable|IPD|AvantGo|DoCoMo|UP.Browser|Vodafone|J-PHONE|PDXGW|ASTEL|EudoraWeb|Minimo|PLink|NetFront|Xiino|iPhone|Vodafone|J-PHONE|DDIPocket|EudoraWeb|Minimo|PLink|Plucker|NetFront|PIE|Xiino|Opera Mini|IEMobile|portalmmm|OpVer|MobileExplorer|Blazer|MobileExplorer|Opera Mobi|BlackBerryd*[A-Za-z]?|PPC|PalmOS|Smartphone|Netscape|Opera|Safari|Firefox|MSIE|HP iPAQ|LGE|MOT-[A-Z0-9-]*|Nokia|AlphaServer|Charon|Fetch|Hv3|IIgs|Mothra|Netmath|OffByOne|pango-text|Avant Browser|midori|Smart Bro|Swiftfox";

//Сначала отделяем имя от версии
brwsr=rematchnocase("(#browsers#)/?/?v?_? ?v?[(?]?([A-Z0-9]*.){0,9}[A-Z0-9-.]*(?=[^A-Z0-9])",ua);

if(arraylen(brwsr) >0)
{
if(arraylen(brwsr) >1)
{
if(brwsr[1]=="MSIE 6.0" && brwsr[2]=="MSIE 7.0")
{
arrayDelete(brwsr,1);
}
if(brwsr[1]=="MSIE 7.0" && brwsr[2]=="MSIE 6.0")
{
arrayDelete(brwsr,2);
}
tempBRWSR=brwsr[arraylen(brwsr)];

for(x=arraylen(brwsr); x>=1; x=x-1)
{
tmp=reMatchNoCase("[A-Za-z0-9.]*", brwsr[x]);
if(listFindNoCase("Navigator,Netscape,Opera,Safari,Firefox,MSIE,PalmOS,PPC", tmp[1]) >0)
{
arrayDeleteAt(brwsr,x);
}
}
if (arraylen(brwsr)==0)
{
brwsr[1]=tmp2;
}
}

tmp=reMatchNoCase("[A-Za-z0-9. _-&]*",brwsr[1]);
brwsr=tmp[1];

if (arraylen(tmp) EQ 2)
{
userBrowser.browserVersion=tmp[2];
}

tmp=rematchnocase("Version/?/?v?_? ?v?[(?]?([A-Z0-9]*.){0,9}[A-Z0-9-.]*(?=[^A-Z0-9])",ua);
if(arraylen(tmp)==1)
{
tmp=rematchnocase("[A-Za-z0-9.]*",tmp[1]);
userBrowser.browserVersion=tmp[2];
}

if (left(brwsr,10)=="BlackBerry"){
brwsr="BlackBerry";
}

if(brwsr contains "MSIE")
{
userBrowser.browserVersion=trim(rereplaceNoCase(brwsr, "MSIE", "", "one"));
brwsr="MSIE";
}

//Сверяем, поддерживает ли браузер HTML5.
//Версии можете уточнить сами — я их по памяти перечислил
switch(brwsr)
{
case "Safari": if(userBrowser.browserVersion >= 4) { userBrowser.HTML5support=true; };
case "Firefox": if(userBrowser.browserVersion >= 4) { userBrowser.HTML5support=true; };
case "Chrome": if(userBrowser.browserVersion >= 6) { userBrowser.HTML5support=true; };
case "Opera": if(userBrowser.browserVersion >= 9.8) { userBrowser.HTML5support=true; };
case "MSIE": if(userBrowser.browserVersion >= 9) { userBrowser.HTML5support=true; };
}

userBrowser.browserName=brwsr;
return userBrowser;
}
//Если не соответствует списку — сообщает о неизвестности браузера
userBrowser.browserName="Unknown";
userBrowser.browserVersion="Unknown";

return userBrowser;
}


Как видно, ничего сложного нет. Если у вас есть другие идеи – поделитесь, буду рад. :)


Комментариев нет:

Отправить комментарий