php для обнаружения браузера

У меня есть странная ошибка css, которую я, кажется, не могу исправить, она возникает только в сафари, а не в Chrome, поэтому таргетинг на webkit не поможет ... то, что я пытался сделать, это установить блок php, чтобы проверить, есть ли у браузеров сафари, если это так, эхо кусок css.

До сих пор я получил это (ниже) - Что работает, но также выводит эхо-оператор в хроме, любая идея, что я ошиблась?

<?php 

    if(isset($_SERVER['HTTP_USER_AGENT'])){
         $agent = $_SERVER['HTTP_USER_AGENT'];
    }

    if(strlen(strstr($agent,"Safari")) > 0 ){
        $browser = 'safari';
    }
    if($browser=='safari'){
        echo '<style>p {font-weight: 300;}</style>';
    }

?>

Я только что играл с echo $_SERVER["HTTP_USER_AGENT"];, и это то, что я получил от сафари

Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit / 536.26.17 (KHTML, например, Gecko) Версия / 6.0.2 Safari / 536.26.17

и из хрома

Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit / 537.22 (KHTML, например Gecko) Chrome / 25.0.1364.172 Safari / 537.22

Таким образом, он может распознавать разные браузеры, но, очевидно, читает их как Apple Web Kit, а не как safari или chrome. Мой php немного ржавый, как мне настроить его специально для пользовательского агента Safari?


person sam    schedule 14.03.2013    source источник
comment
Зачем разбирать его самостоятельно - для этого есть встроенная функция: php.net/manual/ ru / function.get-browser.php   -  person symcbean    schedule 14.03.2013
comment
Поскольку get_browser требует browscap, что делает его принципиально бесполезным.   -  person bonger    schedule 18.09.2014
comment
Почему бы вам не решить ее на клиенте, где проблема существует?   -  person alex    schedule 20.04.2016


Ответы (8)


Вот более общее решение, основанное на ответе po228. Я думаю, что проще искать напрямую по номеру версии браузера, а не по номеру сборки.

$ua = $_SERVER["HTTP_USER_AGENT"];      // Get user-agent of browser

$safariorchrome = strpos($ua, 'Safari') ? true : false;     // Browser is either Safari or Chrome (since Chrome User-Agent includes the word 'Safari')
$chrome = strpos($ua, 'Chrome') ? true : false;             // Browser is Chrome

if($safariorchrome == true AND $chrome == false){ $safari = true; }     // Browser should be Safari, because there is no 'Chrome' in the User-Agent

// Check for version numbers 
$v1 = strpos($ua, 'Version/1.') ? true : false;
$v2 = strpos($ua, 'Version/2.') ? true : false;
$v3 = strpos($ua, 'Version/3.') ? true : false;
$v4 = strpos($ua, 'Version/4.') ? true : false;
$v5 = strpos($ua, 'Version/5.') ? true : false;
$v6 = strpos($ua, 'Version/6.') ? true : false;

// Test versions of Safari
if($safari AND $v1){ echo 'Safari Version 1'; }
else if($safari AND $v2){ echo 'Safari Version 2'; }
else if($safari AND $v3){ echo 'Safari Version 3'; }
else if($safari AND $v4){ echo 'Safari Version 4'; }
else if($safari AND $v5){ echo 'Safari Version 5'; }
else if($safari AND $v6){ echo 'Safari Version 6'; }
else if($safari){ echo 'Safari newer than Version 6'; }
else{ echo "Not Safari"; }
person wicketyjarjar    schedule 12.06.2013
comment
$v1 = strpos($ua, 'Version/1.') ? true : false; эй - person alex; 20.04.2016

Я использую это. это не идеально, но это работает

$browser = $_SERVER['HTTP_USER_AGENT'];
$chrome = '/Chrome/';
$firefox = '/Firefox/';
$ie = '/MSIE/';
if (preg_match($chrome, $browser))
    echo "Chrome/Opera";
if (preg_match($firefox, $browser))
    echo "Firefox";
if (preg_match($ie, $browser))
    echo "Ie";
person WebArtisan    schedule 10.01.2014
comment
Зачем использовать preg_match() для того, что найдет простой строковый поиск? - person alex; 20.04.2016

Для этого запроса есть много проектов с открытым исходным кодом. Я предлагаю добавить класс в ваш проект PHP и запускать его при необходимости: https://github.com/cbschuld/Browser.php

но если вы просто хотите решить свою проблему с помощью своего кода, я думаю, что это сработает:

$agent = '';
$browser = '';
if(isset($_SERVER['HTTP_USER_AGENT'])){
     $agent = $_SERVER['HTTP_USER_AGENT'];
}

if(strlen(strstr($agent,'Safari')) > 0 ){
    $browser = 'safari';
   if(strstr($agent,'Chrome')){
     $browser= 'chrome';
   }
}

if($browser=='safari'){
    echo '<style>p {font-weight: 300;}</style>';
}
person talsibony    schedule 10.01.2014

я решил, используя следующий код

$u_agent = $_SERVER['HTTP_USER_AGENT'];
$issafari=false;
if (preg_match('/Safari/i',$u_agent)){
    $issafari=(!preg_match('/Chrome/i',$u_agent));
}
person Natura Ilec    schedule 14.07.2015

Работает нормально.

function getBrowser($agent = null){
        $u_agent = ($agent!=null)? $agent : $_SERVER['HTTP_USER_AGENT']; 
        $bname = 'Unknown';
        $platform = 'Unknown';
        $version= "";

        //First get the platform?
        if (preg_match('/linux/i', $u_agent)) {
            $platform = 'linux';
        }
        elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
            $platform = 'mac';
        }
        elseif (preg_match('/windows|win32/i', $u_agent)) {
            $platform = 'windows';
        }

        // Next get the name of the useragent yes seperately and for good reason
        if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent)) 
        { 
            $bname = 'Internet Explorer'; 
            $ub = "MSIE"; 
        } 
        elseif(preg_match('/Firefox/i',$u_agent)) 
        { 
            $bname = 'Mozilla Firefox'; 
            $ub = "Firefox"; 
        } 
        elseif(preg_match('/Chrome/i',$u_agent)) 
        { 
            $bname = 'Google Chrome'; 
            $ub = "Chrome"; 
        } 
        elseif(preg_match('/Safari/i',$u_agent)) 
        { 
            $bname = 'Apple Safari'; 
            $ub = "Safari"; 
        } 
        elseif(preg_match('/Opera/i',$u_agent)) 
        { 
            $bname = 'Opera'; 
            $ub = "Opera"; 
        } 
        elseif(preg_match('/Netscape/i',$u_agent)) 
        { 
            $bname = 'Netscape'; 
            $ub = "Netscape"; 
        } 

        // finally get the correct version number
        $known = array('Version', $ub, 'other');
        $pattern = '#(?<browser>' . join('|', $known) .
        ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
        if (!preg_match_all($pattern, $u_agent, $matches)) {
            // we have no matching number just continue
        }

        // see how many we have
        $i = count($matches['browser']);
        if ($i != 1) {
            //we will have two since we are not using 'other' argument yet
            //see if version is before or after the name
            if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
                $version= $matches['version'][0];
            }
            else {
                $version= $matches['version'][1];
            }
        }
        else {
            $version= $matches['version'][0];
        }

        // check if we have a number
        if ($version==null || $version=="") {$version="?";}

        return array(
            'userAgent' => $u_agent,
            'name'      => $bname,
            'version'   => $version,
            'platform'  => $platform,
            'pattern'    => $pattern
        );
    } 
person Ngô Văn Thao    schedule 14.07.2015

У меня была аналогичная проблема с Safari (float: right; отказался сидеть рядом с другим столбцом) в конечном итоге для обнаружения проблемы использовался JavaScript, а не проблемный браузер.

Код JavaScript:

function check() { //called by HTML's <body onLoad="check();">  
  topPos = document.getElementById("rightCol").offsetTop;
  //has rightCol been placed below leftCol ??   
  if (topPos > 200) {
    //if you want a message - something like this works  
    text = "Apologies to Safari (and other?) users: the important links   are at the bottom of the page." + topPos.toString();
    document.getElementById("warning").appendChild(document.createTextNode(text));
    //or, if you want to override your preferred styles something like this  
    document.getElementById("leftCol").style.width = "100%";
    document.getElementById("rightCol").style.width = "100%";
    document.getElementById("rightCol").style.borderTop = "thin dotted black";
  } else //removes the warning paragraph (if required)  
    document.getElementById("warning").normalise();
}

В HTML: 1. Добавьте onLoad="check();" к тегу body.

  1. Поместите <p id="warning"></p> для особого сообщения

  2. Дайте id элементам, которые нужно протестировать или изменить стиль

person RobB    schedule 29.11.2015

Используйте это однозначно, я уже тестировал его ---------

<?php
$msie = strpos($_SERVER["HTTP_USER_AGENT"], 'MSIE') ? true : false;
$firefox = strpos($_SERVER["HTTP_USER_AGENT"], 'Firefox') ? true : false;
$safari = strpos($_SERVER["HTTP_USER_AGENT"], 'Safari') ? true : false;
$chrome = strpos($_SERVER["HTTP_USER_AGENT"], 'Chrome') ? true : false;
?>


<?php
//Firefox
if ($firefox) {
echo 'you are using Firefox!';
echo '<br />';
}

// Safari or Chrome. Both use the same engine - webkit
if ($safari || $chrome) {
echo 'you are using a webkit powered browser';
echo '<br />';
}

// IE
if ($msie) {
echo '<br>you are using Internet Explorer<br>';
echo '<br />';
}

// Not IE and for all other browsers
if (!$msie) {
echo '<br>you are not using Internet Explorer<br>';
echo '<br />';
}

// Add inline css
if ($firefox) {
echo '<style type="text/css">';
echo '.mydiv {position:relative; width:100px; height:50px;}';
echo '</style>';
}
?>

Оригинал: - http://echopx.com/faq/browser-detection-ie-firefox-safari-chrome

person gopal sharma    schedule 20.04.2016

Попробуйте также определенные версии Safari? Я сейчас не использую Mac, поэтому не могу проверить это для вас, но дайте мне знать, поможет ли это:

$ua = $_SERVER["HTTP_USER_AGENT"];

$safari = strpos($ua, 'Safari') ? true : false; // All Safari
$safari_2 = strpos($ua, 'Safari/419') ? true : false; // Safari 2
$safari_3 = strpos($ua, 'Safari/525') ? true : false; // Safari 3
$safari_3_1 = strpos($ua, 'Safari/528') ? true : false; // Safari 3.1
$safari_4 = strpos($ua, 'Safari/531') ? true : false; // Safari 4

// Test Versions
if ($safari_2) { // Safari 2
    echo 'Safari Version 2';
}
elseif ($safari_3) { // Safari 3
    echo 'Safari Version 3';
}
elseif ($safari_4) { // Safari 4
    echo 'Safari Version 4';
}
person po228    schedule 14.03.2013
comment
я добавил эту строку - if ($ safari) {// Safari echo 'Safari Version all'; } - просто пройдите под комментарием // Test Versions и измените оператор $ safari_2 на elseif, и я получил всю версию сафари, если я запустил ваш код точно так же, как указано выше, я ничего не получу .. Я думаю, это потому, что я запускаю safari 6.02 - person sam; 14.03.2013