2013-07-14 42 views
2

我有一个简单的PHP脚本来检测浏览器名称和操作系统。一切顺利,除了OPERA,显示为Chrome。 这里是我的代码:PHP浏览器和操作系统检测显示铬而不是歌剧

<?php 



    $user_agent = $_SERVER['HTTP_USER_AGENT']; 

    function getOS() { 

     global $user_agent; 

     $os_platform = 'Unknown OS Platform'; 

     $os_array  = array (

      '/windows nt 6.2/i'  => 'Windows 8', 
      '/windows nt 6.1/i'  => 'Windows 7', 
      '/windows nt 6.0/i'  => 'Windows Vista', 
      '/windows nt 5.2/i'  => 'Windows Server 2003/XP x64', 
      '/windows nt 5.1/i'  => 'Windows XP', 
      '/windows xp/i'   => 'Windows XP', 
      '/windows nt 5.0/i'  => 'Windows 2000', 
      '/windows me/i'   => 'Windows ME', 
      '/win98/i'    => 'Windows 98', 
      '/win95/i'    => 'Windows 95', 
      '/win16/i'    => 'Windows 3.11', 
      '/macintosh|mac os x/i' => 'Mac OS X', 
      '/mac_powerpc/i'  => 'Mac OS 9', 
      '/linux/i'    => 'Linux', 
      '/ubuntu/i'    => 'Ubuntu', 
      '/iphone/i'    => 'iPhone', 
      '/ipod/i'    => 'iPod', 
      '/ipad/i'    => 'iPad', 
      '/android/i'   => 'Android', 
      '/blackberry/i'   => 'BlackBerry', 
      '/webos/i'    => 'Mobile' 

     ); 

     foreach ($os_array as $regex => $value) { 

      if (preg_match($regex, $user_agent)) $os_platform = $value; 

     } 

     return $os_platform; 

    } 



    function getBrowser() { 

     global $user_agent; 

     $browser  = "Unknown Browser"; 

     $browser_array = array (

      '/msie/i'  => 'Internet Explorer', 
      '/firefox/i' => 'Firefox', 
      '/safari/i'  => 'Safari', 
      '/chrome/i'  => 'Chrome', 
      '/opera/i'  => 'Opera', 
      '/netscape/i' => 'Netscape', 
      '/maxthon/i' => 'Maxthon', 
      '/konqueror/i' => 'Konqueror', 
      '/mobile/i'  => 'Handheld Browser' 

     ); 

     foreach ($browser_array as $regex => $value) { 

      if (preg_match($regex, $user_agent)) $browser = $value; 

     } 

     return $browser; 

    } 



    $user_os  = getOS(); 
    $user_browser = getBrowser(); 

    $device_details = '<strong>Browser: </strong>' . $user_browser . '<br /><strong>Operating System: </strong>' . $user_os; 

    print_r($device_details); 

    echo('<br /><br /><br />' . $_SERVER['HTTP_USER_AGENT']); 



?> 

我通过添加/ OPR /我改变了$ browser_array作为另一个正则表达式的歌剧,并放置在Chrome的正则表达式后2歌剧院正则表达式的:

$browser_array = array (

     '/msie/i'  => 'Internet Explorer', 
     '/firefox/i' => 'Firefox', 
     '/safari/i'  => 'Safari', 
     '/OPR/i'  => 'Opera', 
     '/opera/i'  => 'Opera', 
     '/chrome/i'  => 'Chrome', 
     '/netscape/i' => 'Netscape', 
     '/maxthon/i' => 'Maxthon', 
     '/konqueror/i' => 'Konqueror', 
     '/mobile/i'  => 'Handheld Browser' 

    ); 

这里是Chrome浏览器UA:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36 

这里是Opera UA:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36 OPR/15.0.1147.141 

回答

1

代码逻辑:它首先在循环中找到Opera,然后遇到“Chrome”,它也匹配。所以找到的最后结果是保留的。我建议:

foreach ($browser_array as $regex => $value) { 

    if (preg_match($regex, $user_agent) && $browser == "Unknown Browser") 
     $browser = $value; 

} 

这样,如果已经找到浏览器,它不会将它更改为新的值。确保尽可能正确地排序你的数组。在你的情况下,这段代码首先会找到Opera(匹配OPR),然后忽略Chrome(即使Opera与“Chrome”匹配)。该代码的问题是,这一次,Chrome会是问题(它会被检测为Opera)。你应该使用更具体的REGEX。

某些浏览器部分签名为其他人的事实与历史有关。一些浏览器从其他浏览器获取代码,因此被识别为不同。

+0

它为Chrome和Opera返回“Safari” – medk

+0

很有可能。看看Opera和Chrome签名。它们都包含“Safari”这个词。在您的阵列中首先检查Safari时,它将被使用。您的REGEX应该更具体:Chrome包含“Safari”和“Chrome”。 Opera包含“Chrome”和“OPR”。 –

+0

确定它必须是OPR - > opera - > chrome - > safari – medk

相关问题