【问题标题】:PHP eregi() is deprecated detect browser [duplicate]不推荐使用PHP eregi()检测浏览器[重复]
【发布时间】:2014-01-26 11:53:45
【问题描述】:

我有一个功能可以检测浏览器的版本:

    # Agent - Webbrowsers
    function agent_browser($http_user_agent) {

        // Browsers
        $browsers = array (
            'Android Standaard' => '(Linux)(.*)(Android)(.*)(Mobile Safari)',
            'MSIE 10' => '(MSIE 10)',
            'MSIE 9' => '(MSIE 9)',
            'MSIE 8' => '(MSIE 8)',
            'MSIE 7' => '(MSIE 7)',
            'MSIE 6' => '(MSIE 6)',
            'MSIE 5' => '(MSIE 5)',
            'Opera 12' => '(Opera 12)|(Opera/)(.*)(Version/12)',
            'Opera 11' => '(Opera 11)|(Opera/)(.*)(Version/11)',
            'Opera 10' => '(Opera 10)|(Opera/)(.*)(Version/10)',
            'Opera 9' => '(Opera 9)|(Opera/9)|(Opera/)(.*)(Version/9)',
            'Opera 8' => '(Opera 8)|(Opera/8)|(Opera/)(.*)(Version/8)',
            'Firefox 25' => '(Firefox/25)',
            'Firefox 24' => '(Firefox/24)',
            'Firefox 23' => '(Firefox/23)',
            'Firefox 22' => '(Firefox/22)',
            'Firefox 21' => '(Firefox/21)',
            'Firefox 20' => '(Firefox/20)',
            'Firefox 19' => '(Firefox/19)',
            'Firefox 18' => '(Firefox/18)',
            'Firefox 17' => '(Firefox/17)',
            'Firefox 16' => '(Firefox/16)',
            'Firefox 15' => '(Firefox/15)',
            'Firefox 14' => '(Firefox/14)',
            'Firefox 13' => '(Firefox/13)',
            'Firefox 12' => '(Firefox/12)',
            'Firefox 11' => '(Firefox/11)',
            'Firefox 10' => '(Firefox/10)',
            'Firefox 9' => '(Firefox/9)',
            'Firefox 8' => '(Firefox/8)',
            'Firefox 7' => '(Firefox/7)',
            'Firefox 6' => '(Firefox/6)',
            'Firefox 5' => '(Firefox/5)',
            'Chrome 29' => '(Chrome/29)',
            'Chrome 28' => '(Chrome/28)',
            'Chrome 27' => '(Chrome/27)',
            'Chrome 26' => '(Chrome/26)',
            'Chrome 25' => '(Chrome/25)',
            'Chrome 24' => '(Chrome/24)',
            'Chrome 23' => '(Chrome/23)',
            'Chrome 22' => '(Chrome/22)',
            'Chrome 21' => '(Chrome/21)',
            'Chrome 20' => '(Chrome/20)',
            'Chrome 19' => '(Chrome/19)',
            'Chrome 18' => '(Chrome/18)',
            'Chrome 17' => '(Chrome/17)',
            'Chrome 16' => '(Chrome/16)',
            'Chrome 15' => '(Chrome/15)',
            'Chrome 14' => '(Chrome/14)',
            'Chrome 13' => '(Chrome/13)',
            'Chrome 12' => '(Chrome/12)',
            'Chrome 11' => '(Chrome/11)',
            'Chrome 10' => '(Chrome/10)',
            'BlackBerry 7' => '(BlackBerry)(.*)(Version/7)',
            'BlackBerry 6' => '(BlackBerry)(.*)(Version/6)',
            'Nokia 8' => '(BrowserNG/8)|(NokiaBrowser/8)',
            'Nokia 7' => '(BrowserNG/7)|(NokiaBrowser/7)',
            'Safari 7' => '(Version/7)(.*)(Safari/)',
            'Safari 6' => '(Version/6)(.*)(Safari/)',
            'Safari 5' => '(Version/5)(.*)(Safari/)',
            'Safari 4' => '(Version/4)(.*)(Safari/)',
            'Safari 3' => '(Version/3)(.*)(Safari/)',
            'Safari 2' => '(Version/2)(.*)(Safari/)',
            'Safari 1' => '(Version/1)(.*)(Safari/)'
        );


        foreach($browsers as $browser => $pattern){

            if(eregi($pattern, $http_user_agent)) {
                return $browser;
            }

        }

        return 'Unknown';
    }

我需要用 preg_match() 函数替换 eregi() 函数。因为 eregi() 在 PHP 5.3 中已被弃用。

但是如果我用 pregmatch() 替换这个函数,我会得到很多错误: 警告:preg_match(): 未知修饰符 '|'....

Warning: preg_match(): Unknown modifier '|'....
Warning: preg_match(): Unknown modifier '('....
Warning: preg_match(): Unknown modifier '('....

我该如何解决这个问题?

【问题讨论】:

标签: php preg-match eregi


【解决方案1】:

用相同的分隔符号替换开始和结束的每个模式:

        'MSIE 10' => '/(MSIE 10)/',
        'MSIE 9' => '/(MSIE 9)/',
        'MSIE 8' => '/(MSIE 8)/',
        'MSIE 7' => '/(MSIE 7)/',

等等……

【讨论】:

  • 两个模式怎么样? /(Opera 12)/|/(Opera/)(.*)(Version/12)/ 好像|/(Opera/)(.*)(Version/12)/ 不行……跨度>
  • 然后使用#或$之类的其他符号,它们只需相同即可
【解决方案2】:

需要添加修饰符

 'MSIE 10' => '#(MSIE 10)#',

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2018-03-24
    • 2013-03-03
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多