2012-06-27 4 views
0

browscap.ini что get_browser() зависит находится в http://browsers.garykeith.com/downloadsКак переносить get_browser() из PHP в ColdFusion?

Кто-нибудь знает, как порт, казалось бы, простой get_browser() в CFML?

Спасибо!

+0

может помочь: http://stackoverflow.com/questions/6294932/obtaining-browser-and-version-using-coldfusion –

+0

@Dagon ТНХ, я опирался на 'browserDetect()' для хранения некоторых статистика посетителей, но в последнее время она возвращает много (неизвестных) – Henry

+0

смартфонов/планшетов, всех новых интересных вещей, таких как дети –

ответ

0

Решенный!

Это основано на http://forums.adobe.com/thread/620512 и оптимизировано для работы с улучшенной корректностью.

Это все еще довольно медленно (~ 1 с), потому что работа с ini-файлом с ColdFusion означает, что каждый getProfileString() - это диск ввода-вывода! Быстрее с SSD. :)

function get_browser(user_agent=CGI.HTTP_USER_AGENT, browscap_ini=expandPath("./browscap.ini")) 
{ 
    var result = {}; 

    // Read wildcard patterns from the INI file 
    var browscap_list = getProfileSections(browscap_ini); 

    // Seed some variables 
    var browser_champion_pattern = "*"; 

    // Loop through the patterns to find the best match (relative to length of name pattern) 
    for (var browser_name_pattern in browscap_list) 
    { 
     if (len(browser_name_pattern) >= len(browser_champion_pattern)) 
     { 
      // Massage the wildcard into useable regex 
      var browser_name_regex = replaceList(browser_name_pattern, ".,*,?,(,),[,]", "\.,.*,.,\(,\),\[,\]"); 

      if (left(browser_name_pattern, 1) != "*") 
       browser_name_regex = "^" & browser_name_regex; 

      if (right(browser_name_pattern, 1) != "*") 
       browser_name_regex &= "$"; 

      // Test the resulting regex against the user agent 
      if (reFindNoCase(browser_name_regex, user_agent)) 
       browser_champion_pattern = browser_name_pattern; 
     } 
    } 

    // Set the winning regex patterns 
    var browser_name_pattern = browser_champion_pattern; 

    // Fetch the winning info 
    var keynames = listToArray(browscap_list[browser_champion_pattern]); 
    for (var keyname in keynames) 
     result[keyname] = getProfileString(browscap_ini, browser_champion_pattern, keyname); 

    // Fetch the rest of the info from parents 
    while (structKeyExists(result, "parent")) 
    { 
     var parent = result.parent; 

     structDelete(result, "parent"); 

     var keynames = listToArray(browscap_list[parent]); 
     for (var keyname in keynames) 
      if (!structKeyExists(result, keyname)) 
       result[keyname] = getProfileString(browscap_ini, parent, keyname); 
    } 

    return result; 
} 
+0

Включен в быстрый CFC с пользовательским анализатором INI здесь: https://github.com/henrylearn2rock/BrowscapCFC – Henry

+0

Для этого требуется 'browscap.ini'. Сайт 'http: // browsers.garykeith.com /', похоже, не работает. 'github.com' не имеет образца –