PHP: หาก internet explorer 6, 7, 8 หรือ 9


86

ฉันต้องการสร้างเงื่อนไขใน PHP สำหรับ Internet Explorer เวอร์ชันต่างๆตาม:

if($browser == ie6){ //do this} elseif($browser == ie7) { //dothis } elseif...

ฉันเคยเห็นรูปแบบต่างๆในโค้ดที่คล้ายกัน แต่กำลังมองหาสิ่งที่เรียบง่ายสุด ๆ ซึ่งง่ายมากในการเขียนโค้ดเพื่อทำบางอย่างที่เรียบง่ายและอื่น ๆ

ขอบคุณ

แก้ไข: ฉันต้องการสิ่งนี้เพื่อแสดงข้อความที่แตกต่างให้กับผู้ใช้ดังนั้นเงื่อนไข CSS และอื่น ๆ จึงไม่ดี


4
คุณต้องการให้บริการ CSS ที่แตกต่างกันหรือไม่? ในกรณีที่พิจารณาเงื่อนไขความเห็น ไม่ยุ่งยาก
Pekka

1
เห็นได้ชัดว่า IE10 ไม่รองรับคำสั่งเงื่อนไข
CharlieM

คำตอบ:


130

นี่คือสิ่งที่ฉันลงเอยด้วยการใช้รูปแบบซึ่งตรวจสอบ IE8 และต่ำกว่า:

if (preg_match('/MSIE\s(?P<v>\d+)/i', @$_SERVER['HTTP_USER_AGENT'], $B) && $B['v'] <= 8) {
    // Browsers IE 8 and below
} else {
    // All other browsers
}

75
รูปแบบนี้จะรับรู้ Internet Explorer 10 เป็น Internet Explorer 1
โกลาหล

2
ฉันคิดว่า Opera บางเวอร์ชันจะตรงกับสิ่งนี้ แต่สามารถกรองออกได้โดยเลือก 'Opera'
Liam

45
เพียงแค่เปลี่ยนเป็น'/(?i)msie [2-8]/'. คุณจำเป็นต้องตรวจสอบIE 1หรือไม่? เปิดตัวในปี 1995 และถูกแทนที่ด้วย ie2 ในอีกไม่กี่เดือนต่อมา
Landon

8
ฉันเปลี่ยนเป็น [4-8] การอัปเดต IE มีบ่อยขึ้นเรื่อย ๆ และฉันต้องการให้แน่ใจว่าฉันไม่จำเป็นต้องทำการเปลี่ยนแปลงที่คล้ายกันในช่วงอายุการใช้งานของเว็บแอปที่ฉันกำลังทำงานอยู่ (เนื่องจากมีอายุการใช้งานเพียง 3 ปี) หากมีคนท่องเว็บด้วย IE 5 หรือน้อยกว่าพวกเขาจะมีปัญหามากกว่าการดูเว็บแอปของฉัน
Adam Erstelle

2
หากคุณเพิ่มช่วงเวลามันจะตรวจสอบเวอร์ชันตัวเลขที่ต่ำกว่าโดยไม่ตรวจสอบเวอร์ชัน 10, 20 เป็นต้น'/(?i)msie [1-8]\./'
michaellindahl

85

เวอร์ชันที่จะใช้งานได้กับทั้ง IE10 และ IE11:

preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
if(count($matches)<2){
  preg_match('/Trident\/\d{1,2}.\d{1,2}; rv:([0-9]*)/', $_SERVER['HTTP_USER_AGENT'], $matches);
}

if (count($matches)>1){
  //Then we're using IE
  $version = $matches[1];

  switch(true){
    case ($version<=8):
      //IE 8 or under!
      break;

    case ($version==9 || $version==10):
      //IE9 & IE10!
      break;

    case ($version==11):
      //Version 11!
      break;

    default:
      //You get the idea
  }
}

2
ฉันไม่แน่ใจว่าทำไมคุณถึงใช้คำสั่ง switch เมื่อดูเหมือนว่า if / then จะเหมาะสมกว่า แต่ก็ใช้ได้ผลดี และเห็นได้ชัดว่าคุณเป็นคนเดียวที่อ่านว่า OP ต้องการการสนับสนุนเวอร์ชันแยกต่างหาก
Jake

จริงๆแล้วเราต้องกำหนดเป้าหมาย IE รวมถึง 11 และมันใช้งานได้ดี
code_monk

อุปกรณ์รุ่นใหม่สามารถมีแอตทริบิวต์ที่แตกต่างกันในตัวแทนผู้ใช้ IE11 ดังที่กล่าวไว้ที่นี่: github.com/woothee/woothee-java/issues/6 ในการแก้ไขนิพจน์ทั่วไปควรเปลี่ยนเป็น: Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)และ$version = $matches[1];ควรเปลี่ยนเป็น$version = ($matches[2] == 11)?$matches[2]:$matches[1];. คุณสามารถดูตัวอย่างของ regex ได้ที่นี่: regexr.com/3fb4k
jdgregson

16

คุณสามารถตรวจสอบตัวแปรเซิร์ฟเวอร์ HTTP_USER_AGENT ตัวแทนผู้ใช้ที่โอนโดย IE มีMSIE

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { ... }

สำหรับเวอร์ชันเฉพาะคุณสามารถขยายเงื่อนไขของคุณได้

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== false) { ... }

ดูคำถามที่เกี่ยวข้องนี้ด้วย


@dixus สำหรับ IE11 คุณต้องทำสิ่งนี้preg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

นี่คือแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการตรวจจับเบราว์เซอร์ใน php: http://php.net/manual/en/function.get-browser.php

นี่คือหนึ่งในตัวอย่างที่ดูเหมือนง่ายที่สุด:

<?php
function get_user_browser()
{
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $ub = '';
    if(preg_match('/MSIE/i',$u_agent))
    {
        $ub = "ie";
    }
    elseif(preg_match('/Firefox/i',$u_agent))
    {
        $ub = "firefox";
    }
    elseif(preg_match('/Safari/i',$u_agent))
    {
        $ub = "safari";
    }
    elseif(preg_match('/Chrome/i',$u_agent))
    {
        $ub = "chrome";
    }
    elseif(preg_match('/Flock/i',$u_agent))
    {
        $ub = "flock";
    }
    elseif(preg_match('/Opera/i',$u_agent))
    {
        $ub = "opera";
    }

    return $ub;
}
?>

จากนั้นในรหัสของคุณในภายหลังคุณสามารถพูดอะไรบางอย่างเช่น

$browser = get_user_browser();
if($browser == "ie"){
    //do stuff
}

1
มีเหตุผลใดบ้างที่จะตั้งค่า $ ub แล้วส่งคืนในตอนท้าย แน่นอนว่ามันมีประสิทธิภาพมากกว่า (ข้าม if ที่ไม่จำเป็น) เพื่อส่งคืนชื่อของเบราว์เซอร์แทนที่จะตั้งค่าตัวแปร
w4etwetewtwet

1
การทดสอบเบราว์เซอร์ที่เรียบง่ายบางอย่าง แต่ไม่ทำเวอร์ชันอย่างที่ขอ ...
Jake

chrome useragent มีซาฟารี ดังนั้นการทดสอบข้างต้นควรรายงาน chrome เป็นซาฟารี คำสั่งซื้อควรจะกลับรายการ ตรวจสอบคำหลัก chrome ก่อน
เฉลี่ยโจ

10

ฉันทำนี่

$u = $_SERVER['HTTP_USER_AGENT'];

$isIE7  = (bool)preg_match('/msie 7./i', $u );
$isIE8  = (bool)preg_match('/msie 8./i', $u );
$isIE9  = (bool)preg_match('/msie 9./i', $u );
$isIE10 = (bool)preg_match('/msie 10./i', $u );

if ($isIE9) {
    //do ie9 stuff
}

ฉันชอบเวอร์ชันนี้และได้แก้ไขเพื่อรวมสำหรับ IE11 บน Windows 8.1
Mike Kormendy

5

PHP มีฟังก์ชันที่เรียกว่าget_browser ()ซึ่งจะส่งคืนวัตถุ (หรืออาร์เรย์หากคุณเลือก) พร้อมรายละเอียดเกี่ยวกับเบราว์เซอร์ของผู้ใช้และสิ่งที่สามารถทำได้

การมองผ่านอย่างง่ายทำให้ฉันมีรหัสนี้:

$browser = get_browser( null, true );
if( $browser['name'] == "Firefox" )
    if( $browser['majorversion'] == 4 )
        echo "You're using Firefox version 4!";

นี่ไม่ใช่วิธีที่แน่นอน (เนื่องจากอ่านจากHTTP_USER_AGENTซึ่งสามารถปลอมแปลงได้และบางครั้งจะวิเคราะห์ผิดโดย php) แต่เป็นวิธีที่ง่ายที่สุดที่คุณจะพบได้เท่าที่ฉันรู้


2
ต้องการการกำหนดค่าฝั่งเซิร์ฟเวอร์เพื่อให้ทำงานได้ ฉันไม่แน่ใจว่าผลิตภัณฑ์ทำงานบนเซิร์ฟเวอร์ต่างกันมีความน่าเชื่อถือเพียงใด
ลัตเวีย

5
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
// eh, IE found
}

สิ่งนี้ไม่ตรงกับเวอร์ชัน (และจะตรงกับ IE 10 เป็นต้น)
Oytun

4

คุณสามารถดูhttp://php.net/manual/en/function.get-browser.phpของ PHPget_browser();

บางทีคุณอาจพบว่ามีประโยชน์สำหรับคุณสมบัติอื่น ๆ


3
เรียบร้อย. แต่ต้องมีการตั้งค่าใน php.ini ของคุณซึ่งอาจเป็นปัญหาสำหรับผู้ใช้บางราย
Jake

4

นี่คือฟังก์ชัน php เล็ก ๆ ที่ฉันเขียนซึ่งใช้ regex โดยตรงจากรหัสการดมกลิ่นจาวาสคริปต์ที่แนะนำของ MSFT จากบทความนี้: http://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx

/**
* Returns the version of Internet Explorer or false
*/
function isIE(){

    $isIE = preg_match("/MSIE ([0-9]{1,}[\.0-9]{0,})/",$_SERVER['HTTP_USER_AGENT'],$version);
    if($isIE){
        return $version[1];
    }
    return $isIE;

}

3

การตรวจสอบเฉพาะ MSIE ไม่เพียงพอที่จะตรวจหา IE คุณต้องมี "Trident" ซึ่งใช้ใน IE11 เท่านั้น นี่คือวิธีแก้ปัญหาของฉันซึ่งใช้งานได้กับเวอร์ชัน 8 ถึง 11

$agent=strtoupper($_SERVER['HTTP_USER_AGENT']);
$isIE=(strpos($agent,'MSIE')!==false || strpos($agent,'TRIDENT')!==false);

โปรดดูหัวข้อคำถาม
Jamie Barker

2

คุณสามารถทำได้โดยการแยกส่วนหัว user-agent:

http://php.about.com/od/learnphp/p/http_user_agent.htm

โปรดระวังว่าสิ่งนี้ไม่น่าเชื่อถือและอาจถูกปลอมแปลงได้เล็กน้อย


เพียงจำไว้ว่าUser Agentสามารถแกล้งทำ
กรำ

7
หากผู้ใช้ต้องการปลอมแปลงพวกUser-Agentเขาต้องการดึงเนื้อหาของเพจราวกับว่านั่นคือตัวแทนผู้ใช้ของตนจริงๆ ผลลัพธ์คือสิ่งที่พวกเขาขอ ไม่มีปัญหาที่นี่
Lightness Races ใน Orbit

2

'HTTP_USER_AGENT' เนื้อหาของ User-Agent: ส่วนหัวจากคำขอปัจจุบันหากมี นี่คือสตริงที่แสดงถึงตัวแทนผู้ใช้ที่กำลังเข้าถึงเพจ ตัวอย่างทั่วไปคือ Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586) เหนือสิ่งอื่นใดคุณสามารถใช้ค่านี้กับ get_browser () เพื่อปรับแต่งผลลัพธ์ของเพจของคุณตามความสามารถของตัวแทนผู้ใช้

ดังนั้นฉันถือว่าคุณจะสามารถรับชื่อ / รหัสเบราว์เซอร์จากตัวแปร $ _SERVER ["HTTP_USER_AGENT"]


1

คุณสามารถใช้สิ่งนี้สำหรับข้อความอื่นหรือ div / css

<!--[if IE 6]>
<style type="text/css">
div.ie6 { display:block; }
</style>
<![endif]-->

<!--[if IE 7]>
<style type="text/css">
div.ie7 { display:block; }
</style>
<![endif]-->

<!--[if IE 8]>
<style type="text/css">
div.ie8 { display:block; }
</style>
<![endif]-->

<!--[if IE 9]>
message1
<![endif]-->

<!--[if !IE 6]>
message2
<![endif]-->

<!--[if lt IE 8]>
message3
<![endif]-->

หรือใช้ div ของ css ที่แตกต่างกัน

<!--[if lte IE 8]>
<style type="text/css">
div.lteie8 { display:block; }
</style>
<![endif]-->

<!--[if gt IE 6]>
<style type="text/css">
div.gtie6 { display:block; }
</style>
<![endif]-->

<!--[if gte IE 6]>
<style type="text/css">
div.gteie6 { display:block; }
</style>
<![endif]-->

1

แต่ยังมีประโยชน์ - และใช้งานได้กับ IE11! นี่เป็นอีกวิธีสั้น ๆ ในการรับเบราว์เซอร์ทั่วไปที่ส่งคืนสำหรับคลาส css:

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

สังเกตกรณีใน 'ตรีศูล':

if (isset($_SERVER['HTTP_USER_AGENT']) &&
    ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false)) {   
     // IE is here :-(
    }


-1

แนวทางแบบไตร่ตรองจะดีกว่า นี่คือฟังก์ชั่นด่วนสำหรับตรวจสอบ IE 8

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.