0

此代码不适用于 IE8 和其他旧版本的 IE。

我重写了代码,现在我有两种方法,但仍然失败......

为什么?什么找不到?

我调用函数的方式:

    if (BrowserVersionChecker::is_old_browser()==1) {
//popup here
}

班上:

<?php

class BrowserVersionChecker {

    /**
      Figure out what browser is used, its version and the platform it is
      running on.

      The following code was ported in part from JQuery v1.3.1
     */
    public static function is_old_browser() {

        $old = 0;

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

        // Identify the browser. Check Opera and Safari first in case of spoof. Let Google Chrome be identified as Safari. 
        if (preg_match('/opera/', $userAgent)) {
            $name = 'opera';
        } elseif (preg_match('/webkit/', $userAgent)) {
            $name = 'safari';
        } elseif (preg_match('/msie/', $userAgent)) {
            $name = 'msie';
        } elseif (preg_match('/mozilla/', $userAgent) && !preg_match('/compatible/', $userAgent)) {
            $name = 'mozilla';
        } else {
            $name = 'unrecognized';
        }

        // What version? 
        if (preg_match('/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches)) {
            $version = $matches[1];
        } else {
            $version = 'unknown';
        }

        // Running on what platform? 
        if (preg_match('/linux/', $userAgent)) {
            $platform = 'linux';
        } elseif (preg_match('/macintosh|mac os x/', $userAgent)) {
            $platform = 'mac';
        } elseif (preg_match('/windows|win32/', $userAgent)) {
            $platform = 'windows';
        } else {
            $platform = 'unrecognized';
        }

        $version = intval($version);

        if (($name == 'opera') && ($version <= 11)) {
            $old = 1;
        }

        if (($name == 'safari') && ($version <= 5)) {
            $old = 1;
        }

        if (($name == 'msie') && ($version <= 8)) {
            $old = 1;
        }

        if (($name == 'mozilla') && ($version <= 7)) {
            $old = 1;
        }

//        $arr = array(
//            'name' => $name,
//            'version' => $version,
//            'platform' => $platform,
//            'userAgent' => $userAgent
//        );
//
//        echo '<pre>';
//        print_r($arr);

        return $old;

//        return array(
//            'name' => $name,
//            'version' => $version,
//            'platform' => $platform,
//            'userAgent' => $userAgent
//        );
    }

    //not used any more - deprecated
    public static function is_old_browser2() {
        $old = 0;

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

        if (!empty($_SERVER['HTTP_USER_AGENT'])) {
            // IE <= 7
            // User Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.10.229 Version/11.61
            if (preg_match('#msie\s+(\d+)\.(\d+)#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] <= 8) {
                    $old = 1;
                }
            }
            // Firefox <= 7
            // User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
            elseif (preg_match('#Firefox/(\d+)\.(\d+)[\.\d]+#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] <= 7) {
                    $old = 1;
                }
            }
            // Safari < 5
            // User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.52.7 (KHTML, like Gecko) Version/5.1.2 Safari/534.52.7
            elseif (preg_match('#Version/(\d+)[\.\d]+ Safari/[\.\d]+#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] < 5) {
                    $old = 1;
                }
            }
            // opera < 11
            // User Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.10.229 Version/11.61
            elseif (preg_match('#Opera/[\.\d]+.*?Version/(\d+)[\.\d]+#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] < 11) {
                    $old = 1;
                }
            }
        }

        return $old;
    }

}
4

2 回答 2

1

我强烈建议不要使用 PHP 进行浏览器检查,特别是如果目的是为不同的浏览器提供不同的输出。

事实上,现在浏览器检查通常被认为是不好的做法。你的代码说它是从 jQuery 抄来的;值得知道的是,jQuery 中的这个特性已经被弃用了一段时间,并且从最近的版本中完全删除了。

因此,您的 PHP 代码基于已从 jQuery 中删除的代码,因为他们认为这是不好的做法。这听起来不太好。

那么为什么它被认为是不好的做法呢?

首先,用户代理字符串不应该被认为是可靠的——不仅它很容易被欺骗(大多数浏览器都可以选择更改它),而且一些代理、防火墙和匿名工具可能会改变它或将其完全删除。你不能依赖它是正确的或存在的。

其次,它可能并不总是有用的。例如,您的代码检查 Opera。Opera 目前使用自己的渲染引擎,但很快将切换到 Webkit。这将完全改变他们的浏览器,但无论哪种方式,您的测试都会给出相同的结果。真的不是很有用。您的代码还假定所有 Webkit 浏览器都是 Safari,这显然是错误的。

您的代码无法适应新的浏览器、现有浏览器的未来版本或新的渲染引擎。浏览器世界正在迅速变化;您的代码将难以跟上它。

最后,您的代码将各种浏览器版本描述为“旧”版本,但它们之间没有任何区别。Opera 10、IE7 和 Firefox 2 的功能大相径庭。您还没有告诉我们,如果您使用的是“旧”浏览器,您打算做什么,但至少对于您使用的某些浏览器来说,这可能是不合适的。

因此,如果不建议这样做,还有什么替代方法?

另一种方法是功能测试。这通常使用 Javascript 在浏览器本身中完成。最好的例子是一个名为Modernizr的工具。这是您插入页面的 Javascript 库。它分析用户浏览器的功能,并在网站上设置一堆标志,然后您可以在 CSS 或 Javascript 中使用这些标志。这使得在浏览器缺少特定功能时很容易发现,并且很容易处理它。Modernizr 站点有很好的文档,所以我不会在这里过多解释;只是建议你看看。

还有大量称为“Polyfills”的 javascript 工具,它们旨在使旧版浏览器与您可能想要使用的一些新功能一起工作。您可能需要的几乎所有功能都有 polyfill,因此如果您的问题是浏览器不支持特定功能,那么您很有可能可以处理它。

最后,无论如何,一些浏览器功能只是吸引眼球。如果问题在于圆角或渐变等功能,如果页面不存在,页面仍然可用,请考虑让旧浏览器在没有它们的情况下呈现页面。

上述技术的组合可以使一些非常高级的站点在非常旧的浏览器上运行。

但我必须使用服务器端浏览器检测,这是唯一的方法!

如果您拒绝了我的论点,并且仍然想在 PHP 中进行浏览器测试,我仍然建议您丢弃您的代码,因为 PHP 确实提供了您需要的内置功能。查找get_browser()功能

此函数使用一个名为browsecap.ini 的浏览器信息文件(您需要单独下载)来帮助它确定正在使用的浏览器以及它的功能。这些browsecap.ini 文件可以很容易地下载,更重要的是,随着新浏览器版本的发布,它们很容易保持最新。(嗯,比每隔几个月重写一次代码更容易)。

您可以从这里下载最新的 browsecap.ini 文件:http: //tempdownloads.browserscap.com/

(注意:这是一个临时 URL,将来可能会更改;如果它不起作用,快速访问您最喜欢的搜索引擎将为您提供 browsecap.ini 文件的其他来源)

如果你走这条路,请记住我在这个答案开头所说的话——你不能依赖用户代理字符串的内容。请注意这一点,并准备好处理 UA 字符串无效、不正确或纯空白的情况。

最后,另外一点,如果您计划根据用户代理字符串提供不同的输出,您还应该注意它可能会影响您的搜索引擎排名。与普通浏览器相比,谷歌特别关注那些为其爬虫提供不同输出的网站。它认为这是“掩饰”,并积极惩罚这样做的网站。这不是您想要的(您只是想处理不同的浏览器功能),但如果您需要小心如何操作,以及输出如何不同,因为 Google 可能会误解它。

我希望这会有所帮助。

于 2013-03-19T19:59:20.743 回答
0

与其在处理单个正则表达式案例时费尽心思,不如使用UA-Parser-js之类的东西——一个基于 JavaScript 的用户代理字符串解析器(也可作为 jQuery 插件使用),它试图提供:

  • 浏览器/版本
  • 引擎
  • 操作系统
  • 设备

它可以工作(有一些缺陷),但涵盖了许多常用的浏览器版本。

于 2013-03-19T14:32:11.347 回答