รับข้อมูลระบบปฏิบัติการ


100

ฉันเพิ่งเริ่มสงสัยเกี่ยวกับไซต์เช่นhttp://thismachine.info/ที่ได้รับข้อมูลระบบปฏิบัติการของผู้ใช้ ฉันไม่สามารถค้นหาวิธีการใช้ PHP ได้และต้องการลองคิดดู

ฉันสังเกตเห็นว่าพวกเขาแสดงรายการuser-agentซึ่งให้ข้อมูลมากมายเกี่ยวกับเบราว์เซอร์ พวกเขาได้รับข้อมูลระบบปฏิบัติการจากสิ่งนั้นหรือจากสิ่งอื่น? มี API ที่ฉันสามารถใช้เพื่อรับระบบปฏิบัติการของผู้ใช้ได้หรือไม่

ฉันเห็นว่าพวกเขาได้รับเบราว์เซอร์และ IP อย่างไร แต่ไม่สามารถหาส่วนของระบบปฏิบัติการได้!


ตามที่Amal Muraliระบุไว้ในคำตอบด้านล่างecho $_SERVER['HTTP_USER_AGENT'];จะแสดง (ในระดับหนึ่ง) ระบบปฏิบัติการของผู้ใช้ สำหรับฉันมันตรวจพบMozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0ว่าฉันใช้ Windows XP อยู่ที่ไหนจริง ๆ จึงไม่ใช่วิทยาศาสตร์ที่แน่นอน
Funk Forty Niner

จะhttp://thismachine.info/รู้ได้อย่างไรว่าฉันใช้ Windows XP? ที่ฉันไม่รู้อย่างไรก็ตามพวกเขาต้องใช้สคริปต์ที่จะค้นหาและแทนที่แล้วสะท้อนกลับในภายหลัง สำหรับความรู้ของฉันไม่มีอะไรที่จะกำหนดระบบปฏิบัติการที่แน่นอนได้เนื่องจากฉันเห็นว่าสิ่งนี้จะอยู่ภายใต้โดเมนหลักทรัพย์
Funk Forty Niner

1
ฉันตอบคำถามของตัวเอง หากคุณเข้าไปที่คำตอบนี้ใน SO stackoverflow.com/a/15497878/1415724คุณจะสังเกตได้ว่าเสียงสะท้อนWindows XPจากอาร์เรย์อย่างไร/windows nt 5.1/i' => 'Windows XP',
Funk Forty Niner

1
@ Fred-ii- เนื่องจากหมายเลขเวอร์ชันภายในของ Windows XP คือ 5.1 Wikipedia จะบอกรุ่นภายในของ Windows ทุกรุ่น
StanE

1
PS: Windows Vista = 6.0, Windows 7 = 6.1, Windows 8 = 6.2, Windows 8.1 = 6.3, Windows 10 = 10.0 สำหรับรายการทั้งหมด (และรุ่นของ Windows ในอนาคต) โปรดดู: msdn.microsoft.com/en-us/library/ms724832%28VS.85%29.aspx
StanE

คำตอบ:


207

โค้ดด้านล่างนี้สามารถอธิบายได้ด้วยตัวเองว่าhttp://thismachine.info/สามารถแสดงระบบปฏิบัติการใดที่ใครใช้อยู่

สิ่งที่ทำคือมันดมโมเดลระบบปฏิบัติการหลักของคุณเช่นwindows nt 5.1เป็นของฉันเอง

จากนั้นจะส่งผ่าน windows nt 5.1 / i ไปยัง Windows XP เป็นระบบปฏิบัติการ

ใช้: '/windows nt 5.1/i' => 'Windows XP',จากอาร์เรย์

คุณสามารถพูดได้ว่าการคาดเดาหรือการประมาณ แต่ก็ค่อนข้างปัง

ยืมมาจากคำตอบบน SO https://stackoverflow.com/a/15497878/

<?php

$user_agent = $_SERVER['HTTP_USER_AGENT'];

function getOS() { 

    global $user_agent;

    $os_platform  = "Unknown OS Platform";

    $os_array     = array(
                          '/windows nt 10/i'      =>  'Windows 10',
                          '/windows nt 6.3/i'     =>  'Windows 8.1',
                          '/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',
                            '/edge/i'      => 'Edge',
                            '/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']."");

?>

เชิงอรรถ: (19 ม.ค. 57)มีการแนะนำการแก้ไขเมื่อวันที่ 18 มกราคม 2014 เพื่อเพิ่ม/msie|trident/iโดยYJSoftสมาชิกใหม่ใน SO

ความคิดเห็นอ่านว่า:

ความคิดเห็น: เนื่องจาก ua ของ msie11 ไม่รวม msie (รวมตรีศูลแทน)

ฉันค้นคว้าข้อมูลนี้มาเล็กน้อยและพบลิงก์บางส่วนที่อธิบายสตริงตรีศูล

แม้ว่าการแก้ไขจะถูกปฏิเสธ (ไม่ใช่ของตัวเอง แต่เป็นโดยบรรณาธิการอื่น ๆ ) แต่ก็ควรอ่านลิงก์ด้านบนและใช้วิจารณญาณของคุณอย่างเหมาะสม


ตามคำถามที่ถามเกี่ยวกับการตรวจหา SUSE พบโค้ดส่วนนี้ที่ URL ต่อไปนี้:

รหัสเพิ่มเติม:

/* return Operating System */
function operating_system_detection(){
    if ( isset( $_SERVER ) ) {
        $agent = $_SERVER['HTTP_USER_AGENT'];
    }
    else {
        global $HTTP_SERVER_VARS;
        if ( isset( $HTTP_SERVER_VARS ) ) {
            $agent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
        }
        else {
            global $HTTP_USER_AGENT;
            $agent = $HTTP_USER_AGENT;
        }
    }
    $ros[] = array('Windows XP', 'Windows XP');
    $ros[] = array('Windows NT 5.1|Windows NT5.1)', 'Windows XP');
    $ros[] = array('Windows 2000', 'Windows 2000');
    $ros[] = array('Windows NT 5.0', 'Windows 2000');
    $ros[] = array('Windows NT 4.0|WinNT4.0', 'Windows NT');
    $ros[] = array('Windows NT 5.2', 'Windows Server 2003');
    $ros[] = array('Windows NT 6.0', 'Windows Vista');
    $ros[] = array('Windows NT 7.0', 'Windows 7');
    $ros[] = array('Windows CE', 'Windows CE');
    $ros[] = array('(media center pc).([0-9]{1,2}\.[0-9]{1,2})', 'Windows Media Center');
    $ros[] = array('(win)([0-9]{1,2}\.[0-9x]{1,2})', 'Windows');
    $ros[] = array('(win)([0-9]{2})', 'Windows');
    $ros[] = array('(windows)([0-9x]{2})', 'Windows');
    // Doesn't seem like these are necessary...not totally sure though..
    //$ros[] = array('(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'Windows NT');
    //$ros[] = array('(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})', 'Windows NT'); // fix by bg
    $ros[] = array('Windows ME', 'Windows ME');
    $ros[] = array('Win 9x 4.90', 'Windows ME');
    $ros[] = array('Windows 98|Win98', 'Windows 98');
    $ros[] = array('Windows 95', 'Windows 95');
    $ros[] = array('(windows)([0-9]{1,2}\.[0-9]{1,2})', 'Windows');
    $ros[] = array('win32', 'Windows');
    $ros[] = array('(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})', 'Java');
    $ros[] = array('(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}', 'Solaris');
    $ros[] = array('dos x86', 'DOS');
    $ros[] = array('unix', 'Unix');
    $ros[] = array('Mac OS X', 'Mac OS X');
    $ros[] = array('Mac_PowerPC', 'Macintosh PowerPC');
    $ros[] = array('(mac|Macintosh)', 'Mac OS');
    $ros[] = array('(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'SunOS');
    $ros[] = array('(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'BeOS');
    $ros[] = array('(risc os)([0-9]{1,2}\.[0-9]{1,2})', 'RISC OS');
    $ros[] = array('os/2', 'OS/2');
    $ros[] = array('freebsd', 'FreeBSD');
    $ros[] = array('openbsd', 'OpenBSD');
    $ros[] = array('netbsd', 'NetBSD');
    $ros[] = array('irix', 'IRIX');
    $ros[] = array('plan9', 'Plan9');
    $ros[] = array('osf', 'OSF');
    $ros[] = array('aix', 'AIX');
    $ros[] = array('GNU Hurd', 'GNU Hurd');
    $ros[] = array('(fedora)', 'Linux - Fedora');
    $ros[] = array('(kubuntu)', 'Linux - Kubuntu');
    $ros[] = array('(ubuntu)', 'Linux - Ubuntu');
    $ros[] = array('(debian)', 'Linux - Debian');
    $ros[] = array('(CentOS)', 'Linux - CentOS');
    $ros[] = array('(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - Mandriva');
    $ros[] = array('(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - SUSE');
    $ros[] = array('(Dropline)', 'Linux - Slackware (Dropline GNOME)');
    $ros[] = array('(ASPLinux)', 'Linux - ASPLinux');
    $ros[] = array('(Red Hat)', 'Linux - Red Hat');
    // Loads of Linux machines will be detected as unix.
    // Actually, all of the linux machines I've checked have the 'X11' in the User Agent.
    //$ros[] = array('X11', 'Unix');
    $ros[] = array('(linux)', 'Linux');
    $ros[] = array('(amigaos)([0-9]{1,2}\.[0-9]{1,2})', 'AmigaOS');
    $ros[] = array('amiga-aweb', 'AmigaOS');
    $ros[] = array('amiga', 'Amiga');
    $ros[] = array('AvantGo', 'PalmOS');
    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1}-([0-9]{1,2}) i([0-9]{1})86){1}', 'Linux');
    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1} i([0-9]{1}86)){1}', 'Linux');
    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})', 'Linux');
    $ros[] = array('[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}', 'Linux');
    $ros[] = array('(webtv)/([0-9]{1,2}\.[0-9]{1,2})', 'WebTV');
    $ros[] = array('Dreamcast', 'Dreamcast OS');
    $ros[] = array('GetRight', 'Windows');
    $ros[] = array('go!zilla', 'Windows');
    $ros[] = array('gozilla', 'Windows');
    $ros[] = array('gulliver', 'Windows');
    $ros[] = array('ia archiver', 'Windows');
    $ros[] = array('NetPositive', 'Windows');
    $ros[] = array('mass downloader', 'Windows');
    $ros[] = array('microsoft', 'Windows');
    $ros[] = array('offline explorer', 'Windows');
    $ros[] = array('teleport', 'Windows');
    $ros[] = array('web downloader', 'Windows');
    $ros[] = array('webcapture', 'Windows');
    $ros[] = array('webcollage', 'Windows');
    $ros[] = array('webcopier', 'Windows');
    $ros[] = array('webstripper', 'Windows');
    $ros[] = array('webzip', 'Windows');
    $ros[] = array('wget', 'Windows');
    $ros[] = array('Java', 'Unknown');
    $ros[] = array('flashget', 'Windows');
    // delete next line if the script show not the right OS
    //$ros[] = array('(PHP)/([0-9]{1,2}.[0-9]{1,2})', 'PHP');
    $ros[] = array('MS FrontPage', 'Windows');
    $ros[] = array('(msproxy)/([0-9]{1,2}.[0-9]{1,2})', 'Windows');
    $ros[] = array('(msie)([0-9]{1,2}.[0-9]{1,2})', 'Windows');
    $ros[] = array('libwww-perl', 'Unix');
    $ros[] = array('UP.Browser', 'Windows CE');
    $ros[] = array('NetAnts', 'Windows');
    $file = count ( $ros );
    $os = '';
    for ( $n=0 ; $n<$file ; $n++ ){
        if ( preg_match('/'.$ros[$n][0].'/i' , $agent, $name)){
            $os = @$ros[$n][1].' '.@$name[2];
            break;
        }
    }
    return trim ( $os );
}

แก้ไข: 12 เมษายน 2558

ฉันสังเกตเห็นคำถามเมื่อวานนี้ซึ่งอาจเกี่ยวข้องกับคำถามและคำตอบนี้และอาจเป็นประโยชน์สำหรับบางคน ในเรื่องที่เกี่ยวกับ:

Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-GT-I9505 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36


แก้ไขอีกครั้งและเพิ่มลิงค์อ้างอิงที่ถาม (และตอบ / ยอมรับวันนี้ 4 พ.ย. 59) ซึ่งอาจใช้งานได้

ดูคำถามและคำตอบที่นี่ใน Stack:


3
เจอแล้ว. '/windows nt 6.3/i'สำหรับ Windows 8.1
Hamed Kamrava

1
ฉันพบลิงก์สองสามลิงก์บางลิงก์มีข้อมูลที่เกี่ยวข้อง zytrax.com/tech/web/firefox-history.html gist.github.com/erikng/7140045 hints.macworld.com/article.php?story=20091228114759199 เป็นที่น่าสังเกตว่าใน OS X 10.9 Mavericks Safari ใช้ com.apple .Webkit.Networking เป็น User Agent เมื่อร้องขอการกำหนดค่าอัตโนมัติของพร็อกซี หลังจาก Googling "mavericks HTTP_USER_AGENT"@ben_aaron
Funk Forty Niner

1
วิธีใดในการกำหนด suse?
Peon

1
เพิ่มสิ่งนี้เพื่อตรวจจับระบบปฏิบัติการ Chrome:'/cros/i' => 'Chrome OS'
ตัดการเชื่อมต่อ

1
เช่นเดียวกับ "การประชาสัมพันธ์ที่ไม่ดี" ก็ยังคงเป็น "การประชาสัมพันธ์" ขอบคุณสำหรับการโหวต :)
Funk Forty Niner

10

เมื่อคุณไปที่เว็บไซต์เบราว์เซอร์ของคุณจะส่งคำขอไปยังเว็บเซิร์ฟเวอร์รวมถึงข้อมูลจำนวนมาก ข้อมูลนี้อาจมีลักษณะดังนี้:

GET /questions/18070154/get-operating-system-info-with-php HTTP/1.1  
Host: stackoverflow.com  
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 
            (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
Accept-Language: en-us,en;q=0.5  
Accept-Encoding: gzip,deflate,sdch  
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7  
Keep-Alive: 300  
Connection: keep-alive  
Cookie: <cookie data removed> 
Pragma: no-cache  
Cache-Control: no-cache

ข้อมูลเหล่านี้ถูกใช้โดยเว็บเซิร์ฟเวอร์เพื่อกำหนดวิธีจัดการกับคำขอ ภาษาที่ต้องการและอนุญาตให้บีบอัดได้หรือไม่

ใน PHP ข้อมูลทั้งหมดนี้จะถูกเก็บไว้ใน$_SERVERอาร์เรย์ หากต้องการดูสิ่งที่คุณส่งไปยังเว็บเซิร์ฟเวอร์ให้สร้างไฟล์ PHP ใหม่และพิมพ์ทุกอย่างจากอาร์เรย์

<pre><?php print_r($_SERVER); ?></pre>

สิ่งนี้จะให้คุณเป็นตัวแทนที่ดีของทุกสิ่งที่ถูกส่งไปยังเซิร์ฟเวอร์จากจุดที่คุณสามารถดึงข้อมูลที่ต้องการได้เช่น$_SERVER['HTTP_USER_AGENT']รับระบบปฏิบัติการและเบราว์เซอร์


3
เพื่อให้อ่านง่ายขึ้นฉันมักจะทำ echo "<PRE>"; พิมพ์ _r ($ _ เซิร์ฟเวอร์); เสียงสะท้อน "</PRE>"; นี่เป็นความชอบส่วนบุคคล แต่ช่วยให้ฉันอ่านอาร์เรย์ขนาดใหญ่และนี่เป็นอาร์เรย์ขนาดใหญ่
smcjones

3
@smcjones: คุณควรทำ: echo '<pre>' .print_r ($ _ SERVER, true) '</pre>'; มันสะอาดกว่าแบบนั้น :)
Cornel Raiu

7

เอารหัสต่อไปนี้จากคู่มือ php สำหรับget_browser

$browser = get_browser(null, true);
print_r($browser);

$browserอาร์เรย์มีplatformข้อมูลรวมที่ช่วยให้คุณระบบปฏิบัติการที่เฉพาะเจาะจงในการใช้งาน

โปรดอย่าลืมดูส่วน "หมายเหตุ" ในหน้านั้น นี่อาจเป็นสิ่งที่ (thismachine.info) กำลังใช้อยู่หากไม่มีสิ่งที่ชี้ไว้ในคำตอบอื่น


6

หากคุณต้องการรับข้อมูลทั้งหมดคุณอาจต้องการอ่านสิ่งนี้:
http://php.net/manual/en/function.get-browser.php

คุณสามารถเรียกใช้โค้ดตัวอย่างและคุณจะเห็นว่ามันทำงานอย่างไร:

<?php
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

$browser = get_browser(null, true);
print_r($browser);
?>

ตัวอย่างข้างต้นจะแสดงผลลัพธ์ที่คล้ายกับ:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3

Array
(
    [browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$
    [browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9*
    [parent] => Firefox 0.9
    [platform] => WinXP
    [browser] => Firefox
    [version] => 0.9
    [majorver] => 0
    [minorver] => 9
    [cssversion] => 2
    [frames] => 1
    [iframes] => 1
    [tables] => 1
    [cookies] => 1
    [backgroundsounds] =>
    [vbscript] =>
    [javascript] => 1
    [javaapplets] => 1
    [activexcontrols] =>
    [cdf] =>
    [aol] =>
    [beta] => 1
    [win16] =>
    [crawler] =>
    [stripper] =>
    [wap] =>
    [netclr] =>
)

ฉันพยายามแก้ไขไวยากรณ์ที่เน้นในคำตอบของคุณ แต่คุณปฏิเสธการแก้ไข ...
Thomas Orlita

ฉันตั้งใจจะแค่ต้องการให้ [browser_name_regex] และ [browser_name_pattern] ไฮไลต์ไว้ไม่เช่นนั้นคุณไม่ได้ทำอะไรผิด ตกลง?
OmniPotens

6

จากคำตอบของFred-IIฉันต้องการแบ่งปันสิ่งที่ฉันใช้กับฟังก์ชัน getOS มันหลีกเลี่ยง globals รวมทั้งสองรายการและตรวจจับสถาปัตยกรรม (x32 / x64)

/**
 * @param $user_agent null
 * @return string
 */
function getOS($user_agent = null)
{
    if(!isset($user_agent) && isset($_SERVER['HTTP_USER_AGENT'])) {
        $user_agent = $_SERVER['HTTP_USER_AGENT'];
    }

    // /programming/18070154/get-operating-system-info-with-php
    $os_array = [
        'windows nt 10'                              =>  'Windows 10',
        'windows nt 6.3'                             =>  'Windows 8.1',
        'windows nt 6.2'                             =>  'Windows 8',
        'windows nt 6.1|windows nt 7.0'              =>  'Windows 7',
        'windows nt 6.0'                             =>  'Windows Vista',
        'windows nt 5.2'                             =>  'Windows Server 2003/XP x64',
        'windows nt 5.1'                             =>  'Windows XP',
        'windows xp'                                 =>  'Windows XP',
        'windows nt 5.0|windows nt5.1|windows 2000'  =>  'Windows 2000',
        'windows me'                                 =>  'Windows ME',
        'windows nt 4.0|winnt4.0'                    =>  'Windows NT',
        'windows ce'                                 =>  'Windows CE',
        'windows 98|win98'                           =>  'Windows 98',
        'windows 95|win95'                           =>  'Windows 95',
        'win16'                                      =>  'Windows 3.11',
        'mac os x 10.1[^0-9]'                        =>  'Mac OS X Puma',
        'macintosh|mac os x'                         =>  'Mac OS X',
        'mac_powerpc'                                =>  'Mac OS 9',
        'linux'                                      =>  'Linux',
        'ubuntu'                                     =>  'Linux - Ubuntu',
        'iphone'                                     =>  'iPhone',
        'ipod'                                       =>  'iPod',
        'ipad'                                       =>  'iPad',
        'android'                                    =>  'Android',
        'blackberry'                                 =>  'BlackBerry',
        'webos'                                      =>  'Mobile',

        '(media center pc).([0-9]{1,2}\.[0-9]{1,2})'=>'Windows Media Center',
        '(win)([0-9]{1,2}\.[0-9x]{1,2})'=>'Windows',
        '(win)([0-9]{2})'=>'Windows',
        '(windows)([0-9x]{2})'=>'Windows',

        // Doesn't seem like these are necessary...not totally sure though..
        //'(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'Windows NT',
        //'(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})'=>'Windows NT', // fix by bg

        'Win 9x 4.90'=>'Windows ME',
        '(windows)([0-9]{1,2}\.[0-9]{1,2})'=>'Windows',
        'win32'=>'Windows',
        '(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})'=>'Java',
        '(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}'=>'Solaris',
        'dos x86'=>'DOS',
        'Mac OS X'=>'Mac OS X',
        'Mac_PowerPC'=>'Macintosh PowerPC',
        '(mac|Macintosh)'=>'Mac OS',
        '(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'SunOS',
        '(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'BeOS',
        '(risc os)([0-9]{1,2}\.[0-9]{1,2})'=>'RISC OS',
        'unix'=>'Unix',
        'os/2'=>'OS/2',
        'freebsd'=>'FreeBSD',
        'openbsd'=>'OpenBSD',
        'netbsd'=>'NetBSD',
        'irix'=>'IRIX',
        'plan9'=>'Plan9',
        'osf'=>'OSF',
        'aix'=>'AIX',
        'GNU Hurd'=>'GNU Hurd',
        '(fedora)'=>'Linux - Fedora',
        '(kubuntu)'=>'Linux - Kubuntu',
        '(ubuntu)'=>'Linux - Ubuntu',
        '(debian)'=>'Linux - Debian',
        '(CentOS)'=>'Linux - CentOS',
        '(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)'=>'Linux - Mandriva',
        '(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)'=>'Linux - SUSE',
        '(Dropline)'=>'Linux - Slackware (Dropline GNOME)',
        '(ASPLinux)'=>'Linux - ASPLinux',
        '(Red Hat)'=>'Linux - Red Hat',
        // Loads of Linux machines will be detected as unix.
        // Actually, all of the linux machines I've checked have the 'X11' in the User Agent.
        //'X11'=>'Unix',
        '(linux)'=>'Linux',
        '(amigaos)([0-9]{1,2}\.[0-9]{1,2})'=>'AmigaOS',
        'amiga-aweb'=>'AmigaOS',
        'amiga'=>'Amiga',
        'AvantGo'=>'PalmOS',
        //'(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1}-([0-9]{1,2}) i([0-9]{1})86){1}'=>'Linux',
        //'(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1} i([0-9]{1}86)){1}'=>'Linux',
        //'(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})'=>'Linux',
        '[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}'=>'Linux',
        '(webtv)/([0-9]{1,2}\.[0-9]{1,2})'=>'WebTV',
        'Dreamcast'=>'Dreamcast OS',
        'GetRight'=>'Windows',
        'go!zilla'=>'Windows',
        'gozilla'=>'Windows',
        'gulliver'=>'Windows',
        'ia archiver'=>'Windows',
        'NetPositive'=>'Windows',
        'mass downloader'=>'Windows',
        'microsoft'=>'Windows',
        'offline explorer'=>'Windows',
        'teleport'=>'Windows',
        'web downloader'=>'Windows',
        'webcapture'=>'Windows',
        'webcollage'=>'Windows',
        'webcopier'=>'Windows',
        'webstripper'=>'Windows',
        'webzip'=>'Windows',
        'wget'=>'Windows',
        'Java'=>'Unknown',
        'flashget'=>'Windows',

        // delete next line if the script show not the right OS
        //'(PHP)/([0-9]{1,2}.[0-9]{1,2})'=>'PHP',
        'MS FrontPage'=>'Windows',
        '(msproxy)/([0-9]{1,2}.[0-9]{1,2})'=>'Windows',
        '(msie)([0-9]{1,2}.[0-9]{1,2})'=>'Windows',
        'libwww-perl'=>'Unix',
        'UP.Browser'=>'Windows CE',
        'NetAnts'=>'Windows',
    ];

    // https://github.com/ahmad-sa3d/php-useragent/blob/master/core/user_agent.php
    $arch_regex = '/\b(x86_64|x86-64|Win64|WOW64|x64|ia64|amd64|ppc64|sparc64|IRIX64)\b/ix';
    $arch = preg_match($arch_regex, $user_agent) ? '64' : '32';

    foreach ($os_array as $regex => $value) {
        if (preg_match('{\b('.$regex.')\b}i', $user_agent)) {
            return $value.' x'.$arch;
        }
    }

    return 'Unknown';
}

ปัญหาโดยธรรมชาติของแนวทางนี้คือรายการต้องได้รับการดูแลเพื่อเพิ่มเทคโนโลยีใหม่
Timo Huovinen

พยายามแก้ไข แต่มันไม่ยอมให้ฉันเปลี่ยนตัวละครเดียวดังนั้น'[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3})' => 'Linux',ควรจะเป็น'[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}' => 'Linux',
จันทร์ที่

1
@MonOve Fix เพิ่ม
Timo Huovinen

1

หากคุณต้องการข้อมูลน้อยมากเช่นคลาสใน html สำหรับเบราว์เซอร์ทั่วไปคุณสามารถใช้:

function get_browser()
{
    $browser = '';
    $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
    if (preg_match('~(?:msie ?|trident.+?; ?rv: ?)(\d+)~', $ua, $matches)) $browser = 'ie ie'.$matches[1];
    elseif (preg_match('~(safari|chrome|firefox)~', $ua, $matches)) $browser = $matches[1];

    return $browser;
}

ซึ่งจะส่งคืนค่า 'safari' หรือ 'firefox' หรือ 'chrome' หรือ 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'


0

คุณสามารถค้นหาข้อมูลนี้$_SERVER['HTTP_USER_AGENT']ได้ แต่รูปแบบเป็นรูปแบบอิสระไม่รับประกันว่าจะส่งและผู้ใช้อาจเปลี่ยนแปลงได้ง่ายไม่ว่าจะเพื่อความเป็นส่วนตัวหรือเหตุผลอื่น ๆ

หากคุณไม่ได้ตั้งค่าbrowsecapคำสั่งนี้จะส่งคืนคำเตือน เพื่อให้แน่ใจว่าได้ตั้งค่าไว้คุณสามารถดึงค่าโดยใช้ini_getและดูว่าได้ตั้งค่าไว้หรือไม่

if(ini_get("browscap")) {
    $browser = get_browser(null, true);
    $browser = get_browser($_SERVER['HTTP_USER_AGENT']);  
} 

ตามที่kbaอธิบายไว้ในคำตอบของเขาเบราว์เซอร์ของคุณจะส่งข้อมูลจำนวนมากไปยังเซิร์ฟเวอร์ขณะโหลดหน้าเว็บ เว็บไซต์ส่วนใหญ่ใช้ข้อมูลUser-agentเหล่านี้เพื่อกำหนดระบบปฏิบัติการเบราว์เซอร์และข้อมูลต่างๆของผู้เยี่ยมชม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.