确定操作系统是否为Mac。

11

最近我一直在谷歌上搜寻一个简单易用的php脚本,以便识别用户是否使用的是Mac操作系统。

我想用这个脚本来告诉用户,我要给他们介绍的键盘快捷键是“控制键”还是“命令键”。我不需要知道浏览器或其他信息,只需要知道计算机是否是Mac。

以下是我想要实现的大致内容:

if (operating_system == Mac)
{
    echo "command";
}
else
{
    echo "control";
}
6个回答

22

创建一个名为identifier.php的页面

<?php
$user_agent = getenv("HTTP_USER_AGENT");

if(strpos($user_agent, "Win") !== FALSE)
$os = "Windows";
elseif(strpos($user_agent, "Mac") !== FALSE)
$os = "Mac";
?>

然后将其包含在您网站的标题中。

之后您可以像这样使用它:

<?php
if($os === "Windows")
{

}
elseif($os === "Mac")
{

} 
?>

编辑:

针对Windows手机:

if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows phone os') > 0) {
    $mobile_browser = 1;
  }

1
这段代码会将所有iOS设备检测为Mac,因为它们的UA中都包含“like Mac OS X”。相反,你应该检查“Macintosh”而不是“Mac”。 - kremalicious
当在Windows Phone上使用时,你的答案可能会出现问题。对于Windows系统,Windows和Windows Phone将会给出相同的答案。 - WhiteHorse
@WhiteHorse 或 if(stripos($user_agent, "windows") !== false && stripos($user_agent, "phone") === false) {/*Windows电脑*/} else {/*Windows手机*/}。您可以随意使用 if ... elseif ... else 测试。但仍然不是100%准确,因为可能会有 IOTCE 等。这个答案只是一个概念证明。 - Fr0zenFyr

7
 <?php

    function getBrowserOS() { 

        $user_agent     =   $_SERVER['HTTP_USER_AGENT']; 
        $browser        =   "Unknown Browser";
        $os_platform    =   "Unknown OS Platform";

        // Get the Operating System Platform

            if (preg_match('/windows|win32/i', $user_agent)) {

                $os_platform    =   'Windows';

                if (preg_match('/windows nt 6.2/i', $user_agent)) {

                    $os_platform    .=  " 8";

                } else if (preg_match('/windows nt 6.1/i', $user_agent)) {

                    $os_platform    .=  " 7";

                } else if (preg_match('/windows nt 6.0/i', $user_agent)) {

                    $os_platform    .=  " Vista";

                } else if (preg_match('/windows nt 5.2/i', $user_agent)) {

                    $os_platform    .=  " Server 2003/XP x64";

                } else if (preg_match('/windows nt 5.1/i', $user_agent) || preg_match('/windows xp/i', $user_agent)) {

                    $os_platform    .=  " XP";

                } else if (preg_match('/windows nt 5.0/i', $user_agent)) {

                    $os_platform    .=  " 2000";

                } else if (preg_match('/windows me/i', $user_agent)) {

                    $os_platform    .=  " ME";

                } else if (preg_match('/win98/i', $user_agent)) {

                    $os_platform    .=  " 98";

                } else if (preg_match('/win95/i', $user_agent)) {

                    $os_platform    .=  " 95";

                } else if (preg_match('/win16/i', $user_agent)) {

                    $os_platform    .=  " 3.11";

                }

            } else if (preg_match('/macintosh|mac os x/i', $user_agent)) {

                $os_platform    =   'Mac';

                if (preg_match('/macintosh/i', $user_agent)) {

                    $os_platform    .=  " OS X";

                } else if (preg_match('/mac_powerpc/i', $user_agent)) {

                    $os_platform    .=  " OS 9";

                }

            } else if (preg_match('/linux/i', $user_agent)) {

                $os_platform    =   "Linux";

            }

            // Override if matched

                if (preg_match('/iphone/i', $user_agent)) {

                    $os_platform    =   "iPhone";

                } else if (preg_match('/android/i', $user_agent)) {

                    $os_platform    =   "Android";

                } else if (preg_match('/blackberry/i', $user_agent)) {

                    $os_platform    =   "BlackBerry";

                } else if (preg_match('/webos/i', $user_agent)) {

                    $os_platform    =   "Mobile";

                } else if (preg_match('/ipod/i', $user_agent)) {

                    $os_platform    =   "iPod";

                } else if (preg_match('/ipad/i', $user_agent)) {

                    $os_platform    =   "iPad";

                }

        // Get the Browser

            if (preg_match('/msie/i', $user_agent) && !preg_match('/opera/i', $user_agent)) { 

                $browser        =   "Internet Explorer"; 

            } else if (preg_match('/firefox/i', $user_agent)) { 

                $browser        =   "Firefox";

            } else if (preg_match('/chrome/i', $user_agent)) { 

                $browser        =   "Chrome";

            } else if (preg_match('/safari/i', $user_agent)) { 

                $browser        =   "Safari";

            } else if (preg_match('/opera/i', $user_agent)) { 

                $browser        =   "Opera";

            } else if (preg_match('/netscape/i', $user_agent)) { 

                $browser        =   "Netscape"; 

            } 

            // Override if matched

                if ($os_platform == "iPhone" || $os_platform == "Android" || $os_platform == "BlackBerry" || $os_platform == "Mobile" || $os_platform == "iPod" || $os_platform == "iPad") { 

                    if (preg_match('/mobile/i', $user_agent)) {

                        $browser    =   "Handheld Browser";

                    }

                }

        // Create a Data Array

            return array(
                'browser'       =>  $browser,
                'os_platform'   =>  $os_platform
            );

    } 


    $user_agent     =   getBrowserOS();

    $device_details =   "<strong>Browser: </strong>".$user_agent['browser']."<br /><strong>Operating System: </strong>".$user_agent['os_platform']."";

    print_r($device_details);

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

    ?>

4
function getUserOS(){
$osList = array
(
    'Windows 7' => 'windows nt 6.1',
    'Windows Vista' => 'windows nt 6.0',
    'Windows Server 2003' => 'windows nt 5.2',
    'Windows XP' => 'windows nt 5.1',
    'Windows 2000 sp1' => 'windows nt 5.01',
    'Windows 2000' => 'windows nt 5.0',
    'Windows NT 4.0' => 'windows nt 4.0',
    'Windows Me' => 'win 9x 4.9',
    'Windows 98' => 'windows 98',
    'Windows 95' => 'windows 95',
    'Windows CE' => 'windows ce',
    'Windows (version unknown)' => 'windows',
    'OpenBSD' => 'openbsd',
    'SunOS' => 'sunos',
    'Ubuntu' => 'ubuntu',
    'Linux' => '(linux)|(x11)',
    'Mac OSX Beta (Kodiak)' => 'mac os x beta',
    'Mac OSX Cheetah' => 'mac os x 10.0',
    'Mac OSX Puma' => 'mac os x 10.1',
    'Mac OSX Jaguar' => 'mac os x 10.2',
    'Mac OSX Panther' => 'mac os x 10.3',
    'Mac OSX Tiger' => 'mac os x 10.4',
    'Mac OSX Leopard' => 'mac os x 10.5',
    'Mac OSX Snow Leopard' => 'mac os x 10.6',
    'Mac OSX Lion' => 'mac os x 10.7',
    'Mac OSX (version unknown)' => 'mac os x',
    'Mac OS (classic)' => '(mac_powerpc)|(macintosh)',
    'QNX' => 'QNX',
    'BeOS' => 'beos',
    'OS2' => 'os/2',
    'SearchBot'=>'(nuhk)|(googlebot)|(yammybot)|(openbot)|(slurp)|(msnbot)|(ask jeeves/teoma)|(ia_archiver)'
);

$useragent = $_SERVER['HTTP_USER_AGENT'];
$useragent = strtolower($useragent);

foreach($osList as $os=>$match) {
    if (preg_match('/' . $match . '/i', $useragent)) {
        break;  
    }
    else
    {
        //$os = "Not automatically detected.<br />$useragent";  
        $os = "unknown";
    }
}

return $os;
}

2

很遗憾,这实际上是做不到的。


为了回答您的问题而不深入讨论为什么用户代理嗅探是错误的,下面是一些代码,可以实现您想要的功能:

$mactest = strpos($_SERVER["HTTP_USER_AGENT"], 'Macintosh') ? true : false;

if($mactest) {
  do something
} else {
  do something else
}

1
请查看http://ellislab.com/codeigniter/user-guide/libraries/user_agent.html 根据从浏览器检测确切的操作系统版本 简短回答:你不能。 详细回答: 你只有HTTP User-Agent标头中的信息,其中通常包含操作系统名称和版本。
通常,运行在Mac OS和Linux上的浏览器发送足够的信息以识别确切的操作系统。例如,这是我的User-Agent标头:

Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030423 Ubuntu/8.10 (intrepid) Firefox/3.0.7

你可以看到我正在运行Ubuntu 8.10 Intrepid Ibex。
这是Firefox和Safari 4 Beta在我的MacBook Pro上报告的情况:

火狐浏览器版本:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.7) Gecko/2009021906 Firefox/3.0.7

苹果Safari浏览器版本:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16

相比之下,Windows浏览器通常只报告操作系统的版本而不是具体的软件包(如Pro、Business等):

火狐浏览器版本:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x

// 这将帮助您

$uagent = $_SERVER['HTTP_USER_AGENT'] . "<br/>";

function os_info($uagent)
{
    // the order of this array is important
    global $uagent;
    $oses   = array(
        'Win311' => 'Win16',
        'Win95' => '(Windows 95)|(Win95)|(Windows_95)',
        'WinME' => '(Windows 98)|(Win 9x 4.90)|(Windows ME)',
        'Win98' => '(Windows 98)|(Win98)',
        'Win2000' => '(Windows NT 5.0)|(Windows 2000)',
        'WinXP' => '(Windows NT 5.1)|(Windows XP)',
        'WinServer2003' => '(Windows NT 5.2)',
        'WinVista' => '(Windows NT 6.0)',
        'Windows 7' => '(Windows NT 6.1)',
        'Windows 8' => '(Windows NT 6.2)',
        'WinNT' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
        'OpenBSD' => 'OpenBSD',
        'SunOS' => 'SunOS',
        'Ubuntu' => 'Ubuntu',
        'Android' => 'Android',
        'Linux' => '(Linux)|(X11)',
        'iPhone' => 'iPhone',
        'iPad' => 'iPad',
        'MacOS' => '(Mac_PowerPC)|(Macintosh)',
        'QNX' => 'QNX',
        'BeOS' => 'BeOS',
        'OS2' => 'OS/2',
        'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
    );
    $uagent = strtolower($uagent ? $uagent : $_SERVER['HTTP_USER_AGENT']);
    foreach ($oses as $os => $pattern)
        if (preg_match('/' . $pattern . '/i', $uagent))
            return $os;
    return 'Unknown';
}
echo os_info($uagent);

1
尝试使用内置于PHP中的get_browser()函数。
$browser = get_browser(null, true);
echo "Platform: " . $browser["platform"] . "\n"; 

谢谢您的快速回答!说实话,我对php还比较新。您介意为我将其转换成if语句格式吗?非常感谢。 - totallyuneekname
注意:只有在php.ini中设置了browscap并且browscap也存在时,此功能才能正常工作。根据我的经验,这种情况并不常见。 - Ares
@user2180108 get_browser()需要完整功能的browsecap.ini文件。这需要您进行管理输入。使用提供的URL了解get_browser,并访问此处:http://tempdownloads.browserscap.com/以获取browsecap.ini。 - Daryl Gill
@Ares 大多数网络提供商都有一个 browsecap 的版本,只是取决于版本。大多数都是最新的,有些则只是保持原样,因为“它可以工作”。 - Daryl Gill
@user2180108 嗯,根据目前的情况,他已经超越了这个问题 ;) - Daryl Gill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接