学而时习之 不亦说乎

PHP判断访客是否手机移动端访问

发表于:2015-04-07分类:PHP笔记

网上找了很多方法基本上都是判断$_SERVER方法。我整理了一下。请注意在使用的时候尽量兼容大小写来判断。

1.根据UA字符串特征判断

通过$_SERVER['HTTP_USER_AGENT']获取浏览器的UA,使用字符串搜索来判断是否拥有字符串特征。移动端特征有非常非常多,所以使用ua判断不是100%准确,很可能误判,常见的特征有:<!--more-->

Array('nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile');

2.$_SERVER['HTTP_X_WAP_PROFILE']判断

$_SERVER['HTTP_X_WAP_PROFILE']该值为真,那就一定是移动客户端。但是移动客户端也可能获取不到该值。

3.$_SERVER['HTTP_VIA']判断

stristr($_SERVER['HTTP_VIA'],"wap")
//判断该值是否存在wap,如果为真,那就一定是移动客户端。但是同上移动客户端也可能获取不到该值。
//stristr兼容大小写

4.$_SERVER['HTTP_ACCEPT']判断

$_SERVER['HTTP_ACCEPT']如果只支持wml并且不支持html那一定是移动设备,如果支持wml和html但是wml在html之前则是移动设备

if ((stripos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (stripos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (stripos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < stripos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
return true;
}
//stripos函数兼容大小写

5.更强大的Mobile-Detect 开源类

项目地址:https://github.com/serbanghita/Mobile-Detect
或者:http://mobiledetect.net/
使用方法:

require_once 'Mobile_Detect.php';//引用
$detect = new Mobile_Detect;//实例化
if ( $detect->isMobile() ) {
} //判断全部移动端(含平板)
if( $detect->isTablet() ){
} //判断是不是平板
if( $detect->isMobile() && !$detect->isTablet() ){
} //判断全部移动端(除了平板)
if( $detect->isiOS() ){
} //判断IOS系统
if( $detect->isAndroidOS() ){
} //判断苹果系统
//该函数还能判断浏览器品牌,和移动设备的型号等。不过需要保持更新才能保持判断准确率。

6.摘自thinkphp的判断方法 比较靠谱:是1-4方法的大集合

请注意替换兼容大小写的函数来提高准确性,以下摘自:http://www.thinkphp.cn/topic/6541.html

function ismobile() {
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
        return true;
    //此条摘自TPM智能切换模板引擎,适合TPM开发
    if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
        return true;
    //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    if (isset ($_SERVER['HTTP_VIA']))
        //找不到为flase,否则为true
        return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
    //判断手机发送的客户端标志,兼容性有待提高
    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array(
            'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
        );
        //从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    //协议法,因为有可能不准确,放到最后判断
    if (isset ($_SERVER['HTTP_ACCEPT'])) {
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
}

更多参考

http://freenish.com/3-ways-to-detect-mobile-devices-in-your-website-by-using-php/
http://www.laozuo.org/1329.html (前端javascript跳转)
http://www.w3cschool.cc/cssref/css3-pr-mediaquery.html (前端 CSS3 @media 判断宽度max-width 响应式设计 )