11

I have been doing a lot of Googling recently to try and find a simple, easy php script that will identify if the user is on a Mac or not.

I want to use this to tell users if the keyboard shortcut I am telling them is "control" or "command". I don't need to know the browser or anything, just if the computer is a Mac.

Here is an outline of what I'm asking is possible:

if (operating_system == Mac)
{
 echo "command";
}
else
{
 echo "control";
}
Lee Taylor
7,99416 gold badges38 silver badges53 bronze badges
asked Apr 6, 2013 at 1:08
1
  • I know this is old, but I see only browser-related answers, and it's a simple task in CLI. If this is CLI, you can do: "if (PHP_OS_FAMILY == 'Darwin')" .... this will be true if MacOS, false otherwise. Commented Dec 12, 2023 at 1:19

6 Answers 6

22

Create a page: 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";
?>

then include it on the header of your site.

After that you can use it like this:

<?php
if($os === "Windows")
{
}
elseif($os === "Mac")
{
} 
?>

Edit:

For windows phone:

if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows phone os') > 0) {
 $mobile_browser = 1;
 }
answered Apr 6, 2013 at 1:11
Sign up to request clarification or add additional context in comments.

3 Comments

This code will detect all iOS devices as being a Mac cause they all include "like Mac OS X" in their UA. Instead, you should check for "Macintosh" instead of "Mac".
Your answer will give problem When used on Windows Phone. Windows and Windows Phone will give you same answer for Windows.
@WhiteHorse or if(stripos($user_agent, "windows") !== false && stripos($user_agent, "phone") === false) {/*Windows computer*/} else {/*Windows phone*/}. Play with the if ... elseif ... else tests however you want. Still this is not 100% accurate because there may be an IOT or CE etc. This answer is just a proof of concept.
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']."");
 ?>
answered Apr 6, 2013 at 1:25

Comments

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;
}
answered Apr 6, 2013 at 1:30

Comments

2

Unfortunately this cannot really be done.


For the purpose of answering your question without going too far into why User Agent sniffing is broken here is some code that will do what you want:

$mactest = strpos($_SERVER["HTTP_USER_AGENT"], 'Macintosh') ? true : false;
if($mactest) {
 do something
} else {
 do something else
}
answered Apr 6, 2013 at 1:13

Comments

1

Try the get_browser() function that's built into PHP.

$browser = get_browser(null, true);
echo "Platform: " . $browser["platform"] . "\n"; 
answered Apr 6, 2013 at 1:10

5 Comments

Thanks for answering so fast! To tell you the truth, I'm fairly new to php. do you mind putting this into an if statement format for me? Thank you so much
Note: This will only work if browscap is set in php.ini and the browscap is also present. In my experience, that is not very common.
@user2180108 get_browser() required browsecap.ini for full functionality. This requires your administration input.. Use the URL provided to read about get_browser, and go here: tempdownloads.browserscap.com for browsecap.ini
@Ares most web providers have a version of browsecap, just depending on the version.. Most are up to date, some just leave it as it is because 'it works'
@user2180108 Well, with the current status..He's currently above this question ;)
1

Have a look at http://ellislab.com/codeigniter/user-guide/libraries/user_agent.html

As per Detect exact OS version from browser Short answer: Exactly You can't.

Long answer:

All you have is the information in the HTTP User-Agent header, which usually contains the OS name and version.

Usually, browsers running on Mac OS and Linux send enough information to identify the exact OS. For example, here's my User-Agent header:

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

You can see that I'm running Ubuntu 8.10 Intrepid Ibex.

And here's what Firefox and Safari 4 Beta report on my 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

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 browsers, on the other hand, usually only report the OS version and not the specific package (Pro, Business, etc.):

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x

// this will help you

$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);
answered Apr 6, 2013 at 1:12

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.