PHP获取客户端操作系统,游览器类型及版本号

<?php
/**
 * 客户端工具类
 *
 * For example:
 *
 * clientUtil::getBrowser($_SERVER['HTTP_USER_AGENT'],'是否显示版本号')  //获取客户端游览器类型和版本号
 * clientUtil::getPlatForm($_SERVER['HTTP_USER_AGENT],'是否显示版本号')  //获取客户端操作系统和版本号
 *
 * @author 2016-01-23
 */
class clientUtil {

    /**
     * 各类主流游览器正则 * @var array
     * @author 2016-01-22
     */
    protected static $browsers = array(
        'Edge'            => 'Edge',
        'IE'              => 'MSIE|IEMobile|MSIEMobile|Trident/[.0-9]+',
        'Chrome'          => '(?:\bCrMo\b|CriOS|Android)?.*Chrome/[.0-9]* (Mobile)?',
        'Opera'           => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+',
        'Firefox'         => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile',
        'Safari'          => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari',
        'UCBrowser'       => 'UC.*Browser|UCWEB', //UC游览器
        'QQBrowser'       => 'MQQBrowser|TencentTraveler', //QQ游览器
        'The world'       => 'The world', //世界之窗游览器
        'Maxthon'         => 'Maxthon', //遨游游览器
        'baiduboxapp'     => 'baiduboxapp',
        'baidubrowser'    => 'baidubrowser',
        'NokiaBrowser'    => 'Nokia',
    );

    /**
     * 操作系统正则
     * note:移动设备的系统需优先匹配
     *      故正则需要放在电脑系统前面
     * @var array
     * @author 2016-01-23
     */
    protected static $platforms = array(
        'iOS'               => '\biPhone.*Mobile|\biPod|\biPad',
        'Windows Mobile OS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;',
        'Windows Phone OS'  => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
        'Android'           => 'Android',
        'BlackBerry OS'     => 'blackberry|\bBB10\b|rim tablet os', //黑莓
        'SymbianOS'         => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', //塞班
        'webOS'             => 'webOS|hpwOS',
        'MicroMessenger'    => 'MicroMessenger', //微信
        'Windows'           => 'Windows',
        'Windows NT'        => 'Windows NT',
        'Mac OS X'          => 'Mac OS X',
        'Ubuntu'            => 'Ubuntu',
        'Linux'             => 'Linux',
        'Chrome OS'         => 'CrOS',
    );

    /**
     * 版本号匹配正则(游览器 + 操作系统)
     * @var array
     * @author 2016-01-22
     */
    protected static $versionRegexs = array(

        // Browser
        'Maxthon'       => 'Maxthon [VER]', //遨游
        'Chrome'        => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), //谷歌
        'Firefox'       => 'Firefox/[VER]', //火狐
        'Fennec'        => 'Fennec/[VER]', //火狐
        'IE'            => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'rv:[VER]'),
        'Opera'         => array('OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]', 'Opera [VER]'),
        'UC Browser'    => 'UC Browser[VER]', //UC
        'QQBrowser'     => array('MQQBrowser/[VER]','TencentTraveler/[VER]'), //QQ
        'MicroMessenger'=> 'MicroMessenger/[VER]', //微信
        'baiduboxapp'   => 'baiduboxapp/[VER]', //百度盒子
        'baidubrowser'  => 'baidubrowser/[VER]', //百度
        'Safari'        => array('Version/[VER]', 'Safari/[VER]' ), //Mac OS X中的浏览器
        'NokiaBrowser'  => 'NokiaBrowser/[VER]', //诺基亚

        // OS
        'iOS'              => '\bi?OS\b [VER][ ;]{1}',
        'BlackBerry'       => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), //黑莓手机
        'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'),
        'Windows Phone'    => 'Windows Phone [VER]',
        'Windows NT'       => 'Windows NT [VER]',
        'Windows'          => 'Windows NT [VER]',
        'SymbianOS'        => array('SymbianOS/[VER]', 'Symbian/[VER]'), //塞班系统
        'webOS'            => array('webOS/[VER]', 'hpwOS/[VER];'), //LG
        'Mac OS X'         => 'MAC OS X [VER]', //苹果系统
        'BlackBerry OS'    => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'),
        'Android'          => 'Android [VER]',
        'Chrome OS'        => 'CrOS x86_64 [VER]',
    );


    /**
     * 获取客户端游览器
     * @param $userAgent $_SERVER['HTTP_USER_AGENT']
     * @param bool $isReTurnVersion //是否一起返回版本号
     * @return string (类型 + 版本号)
     * @author 2016-01-23
     */
    public static function getBrowser($userAgent,$isReTurnVersion = false) {
        if(empty($userAgent)) {
            return '';
        }
        $clientBrowser = '';
        foreach((array)self::$browsers as $key => $browser) {
            if(self::match($browser,$userAgent)) {
                $clientBrowser = $key;
                break;
            }
        }
        if($isReTurnVersion && $clientBrowser) {
            $clientBrowser .= ' '.self::getVersion($clientBrowser,$userAgent);
        }
        return $clientBrowser;
    }

    /**
     * 获取客户端操作系统
     * @param $userAgent
     * @param bool $isReTurnVersion //是否一起返回版本号
     * @return string
     * @author 2016-01-23
     */
    public static function getPlatForm($userAgent,$isReTurnVersion = false) {
        if(empty($userAgent)) {
            return '';
        }
        $clientPlatform = '';
        foreach((array)self::$platforms as $key => $platform) {
            if(self::match($platform,$userAgent)) {
                $clientPlatform = $key;
                break;
            }
        }
        if($isReTurnVersion && $clientPlatform) {
            $clientPlatform .= ' '.self::getVersion($clientPlatform,$userAgent);
        }
        return $clientPlatform;
    }

    /**
     * 查询版本号
     * @param $propertyName (操作系统名称和或游览器名称)
     * @see self::$versionRegexs
     * @param $userAgent
     * @return string
     * @author 2016-01-22
     */
    public static function getVersion($propertyName,$userAgent) {

        $verRegex = array_key_exists($propertyName,self::$versionRegexs)
            ? self::$versionRegexs[$propertyName] : null;
        if(!$verRegex) {
            return '';
        } else {
            $verRegex = (array)$verRegex;
        }

        $match = self::matchVersion($verRegex,$userAgent); //开始匹配
        if($match && stripos($propertyName,'window') !== false) { //windown系统版本号需要转换
            return self::getWinVersion($match);
        } else {
            return str_replace('_','.',$match);
        }
    }

    /**
     * 根据匹配结果转换window系统版本号
     * @param $match
     * @return string
     * @author 2016-01-22
     */
    protected static function getWinVersion($match) {
        if($match == '6.0') {
            return 'Vista';
        }
        else if($match == '6.1') {
            return '7';
        }
        else if($match == '6.2') {
            return '8';
        }
        else if($match == '5.1') {
            return 'XP';
        }
    }

    /**
     * 正则匹配
     * @param array $regex
     * @param $userAgent
     * @return string
     * @author 2016-01-22
     */
    protected static function match($regex,$userAgent) {
        return (bool)preg_match(sprintf('#%s#is',$regex),$userAgent,$matches);
    }

    /**
     * 版本号正则匹配
     * @param array $regexs
     * @param $userAgent
     * @return string
     * @author 2016-01-22
     */
    protected static function matchVersion($regexs,$userAgent) {
        foreach((array)$regexs as $regex) {
            $regex = str_replace('[VER]','([\w\.]+)', $regex);
            $match = (bool)preg_match(sprintf('#%s#is',$regex),$userAgent,$matches);
            if($match) {
                return $matches[1];
            }
        }
        return '';
    }

}

 

 

 

转载于:https://my.oschina.net/wuzhencan/blog/608258

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值