Typecho 判断终端设备访客系统和浏览器版本的各种函数记录

罗格罗格 技术文档 11天前 (2018-05-01) 51 次浏览 1 次评论

Typecho 判断终端设备访客系统和浏览器版本的各种函数记录.jpg
在我们写 Typecho 主题时有时候为了达到某种个性化要求,可能需要让主题在手机端和电脑端显示不同的样式,这就需要函数来判断访客当前的访问设备为PC还是手机还是PAD,来输出不同的内容,判断移动设备的依据和原理就是通过获取设备的 Agent 来判断,但是考虑到手机品牌没有统一 Agent 规则,不同品牌有不同的 Agent 所以该方法有点蠢,不过我们只需要匹配大部分热门品牌即可,当然也可以通过访客访问的协议判断,但是该方法准确度比较差,所以博主就把这些函数归类到一起作为判断条件,下面给出博主自己一直在用的判断函数:

// 移动端设备判断函数
function isMobile()
{ 
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
    {
        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;
}

上面的使用方法也好很简单,只需要在主题中我们需要调用判断的地方使用下面语句即可:

<?php if(isMobile()){ ?>
// 这里是手机端的一些配置
<?php }else{ ?>
// 这里是非手机端的一些配置
<?php } ?>

当然通常我们可能还会用到一些函数,比如判断客户端是具体是什么设备,就需要使用下面的函数了:

<?php
  //获取USER AGENT
  $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
  //分析数据
  $is_pc = (strpos($agent, 'windows nt')) ? true : false;   
  $is_iphone = (strpos($agent, 'iphone')) ? true : false;   
  $is_ipad = (strpos($agent, 'ipad')) ? true : false;   
  $is_android = (strpos($agent, 'android')) ? true : false;  
  //输出数据 
    if($is_pc){   
        echo "这是Windows PC";   
    }   
    if($is_iphone){   
        echo "这是iPhone";   
    }
    if($is_ipad){   
        echo "这是iPad";   
    }   
    if($is_android){   
        echo "这是Android";   
    }
?>

如果我们需要在主题中判断访客安卓还是苹果来显示不同的广告就需要下面这个函数来进行操作,代码如下:

<?php function get_device_type(){ 
  $agent = strtolower($_SERVER['HTTP_USER_AGENT']); 
  $type = 'other'; 
  if(strpos($agent, 'iphone') || strpos($agent, 'ipad')  ){ 
    $type = 'ios'; 
  } 
  if(strpos($agent, 'android')){ 
    $type = 'android'; 
  } 
  return $type; 
} ?>

前端通过该函数返回值来判断是IOS系统还是Android系统做内容输出即可。

我以为以上函数已经够用了,结果最近又碰到了奇葩的需求,判断操作系统的类型,相信很多同学可能在有些博主的评论处会看到评论者的操作系统和浏览器版本,那么这个是怎么做出来的呢,其实方法和上面一样,很简单就是简单的if判断,下面给出判断操作系统的函数和判断浏览器的函数:

/**
* 取得客户操作名称版本
*
* @access private
* @return void
*/ 
function get_os()
{
    $agent = $_SERVER['HTTP_USER_AGENT'];
    $os = false; 
 
    if (eregi('win', $agent) && strpos($agent, '95'))
    {
      $os = 'Windows 95';
    }
    else if (eregi('win 9x', $agent) && strpos($agent, '4.90'))
    {
      $os = 'Windows ME';
    }
    else if (eregi('win', $agent) && ereg('98', $agent))
{
      $os = 'Windows 98';
    }
  else if (eregi('win', $agent) && eregi('nt 6.0', $agent))
{
      $os = 'Windows Vista';
    }
 else if (eregi('win', $agent) && eregi('nt 6.1', $agent))
{
      $os = 'Windows 7';
    }
    else if (eregi('win', $agent) && eregi('nt 5.1', $agent))
{
      $os = 'Windows XP';
    }
    else if (eregi('win', $agent) && eregi('nt 5', $agent))
{
      $os = 'Windows 2000';
    }
    else if (eregi('win', $agent) && eregi('nt', $agent))
{
      $os = 'Windows NT';
    }
    else if (eregi('win', $agent) && ereg('32', $agent))
{
      $os = 'Windows 32';
    }
    else if (eregi('linux', $agent))
{
      $os = 'Linux';
    }
    else if (eregi('unix', $agent))
{
      $os = 'Unix';
    }
    else if (eregi('sun', $agent) && eregi('os', $agent))
{
      $os = 'SunOS';
    }
    else if (eregi('ibm', $agent) && eregi('os', $agent))
{
      $os = 'IBM OS/2';
    }
    else if (eregi('Mac', $agent) && eregi('PC', $agent))
{
      $os = 'Macintosh';
    }
    else if (eregi('PowerPC', $agent))
{
      $os = 'PowerPC';
    }
    else if (eregi('AIX', $agent))
{
      $os = 'AIX';
    }
    else if (eregi('HPUX', $agent))
{
      $os = 'HPUX';
    }
    else if (eregi('NetBSD', $agent))
{
      $os = 'NetBSD';
    }
    else if (eregi('BSD', $agent))
{
      $os = 'BSD';
    }
    else if (ereg('OSF1', $agent))
{
      $os = 'OSF1';
    }
    else if (ereg('IRIX', $agent))
{
      $os = 'IRIX';
    }
    else if (eregi('FreeBSD', $agent))
{
      $os = 'FreeBSD';
    }
    else if (eregi('teleport', $agent))
{
      $os = 'teleport';
    }
    else if (eregi('flashget', $agent))
{
      $os = 'flashget';
    }
    else if (eregi('webzip', $agent))
{
      $os = 'webzip';
    }
    else if (eregi('offline', $agent))
{
      $os = 'offline';
    }
    else 
    {
      $os = 'Unknown';
    }
    return $os;
}

下面函数为判断用户的浏览器名称和版本:

/**
* 取得阅读器名称和版本
*
* @access public
* @return string
*/ 
function getbrowser()
{
    global $_SERVER; 
 
    $agent           = $_SERVER['HTTP_USER_AGENT'];
    $browser       = '';
    $browser_ver     = ''; 
 
    if (preg_match('/OmniWeb\/(v*)([^\s|;]+)/i', $agent, $regs)) 
    {
      $browser       = 'OmniWeb';
      $browser_ver     = $regs[2];
    } 
 
    if (preg_match('/Netscape([\d]*)\/([^\s]+)/i', $agent, $regs)) 
    {
      $browser       = 'Netscape';
      $browser_ver     = $regs[2];
    } 
 
    if (preg_match('/safari\/([^\s]+)/i', $agent, $regs)) 
    {
      $browser       = 'Safari';
      $browser_ver     = $regs[1];
    } 
 
    if (preg_match('/MSIE\s([^\s|;]+)/i', $agent, $regs)) 
    {
      $browser       = 'Internet Explorer';
      $browser_ver     = $regs[1];
    } 
 
    if (preg_match('/Opera[\s|\/]([^\s]+)/i', $agent, $regs)) 
    {
      $browser       = 'Opera';
      $browser_ver     = $regs[1];
    } 
 
    if (preg_match('/NetCaptor\s([^\s|;]+)/i', $agent, $regs)) 
    {
      $browser       = '(Internet Explorer ' .$browser_ver. ') NetCaptor';
      $browser_ver     = $regs[1];
    } 
 
    if (preg_match('/Maxthon/i', $agent, $regs)) 
    {
      $browser       = '(Internet Explorer ' .$browser_ver. ') Maxthon';
      $browser_ver     = '';
    } 
 
    if (preg_match('/FireFox\/([^\s]+)/i', $agent, $regs)) 
    {
      $browser       = 'FireFox';
      $browser_ver     = $regs[1];
    } 
 
    if (preg_match('/Lynx\/([^\s]+)/i', $agent, $regs)) 
    {
      $browser       = 'Lynx';
      $browser_ver     = $regs[1];
    } 
 
    if ($browser != '')
    {
       return $browser.' '.$browser_ver;
    } 
    else 
    {
      return 'Unknow browser';
    }
}

以上两个函数的使用方法如下:

<?php
echo get_os();//输出操作系统名称
echo getbrowser();//输出浏览器名称
?>

2018年05月10日增加另外一个用 PHP 判断是否为微信浏览器访问的函数,这是一个奇葩的需求,但是可能大家也会用到,所以也贴出函数:

function is_weixin(){ 
    if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {
            return true;
    }   
    return false;
}

同时感谢网友提供判断平台详细类型的PHP开源库 Mobile-Detect ,大家可以直接去 Github 上关注,当然最好也能给我的 Github 点个关注,我的 Gtihub 地址:https://github.com/Moidea

这个开源库的使用很简单,只要下载下来放在你的相应目录下,如果是 Typecho 就放在主题目录下并在 header.php 里通过 $this->need('Mobile_Detect.php'); 引用即可,使用方法如下:

<?php
//引用库
require_once 'Mobile_Detect.php'; 

//初始化Mobile_Detect对象
$detect = new Mobile_Detect;

//属于可移动终端
if($detect->isMobile()) {
    echo 'mobile';
}

//所有平板设备
if( $detect->isTablet()) {
}
//是移动但非平板设备
if( $detect->isMobile() && !$detect->isTablet()) {
}
//IOS系统
if( $detect->isiOS()) {
}
//Android系统
if( $detect->isAndroidOS()) {
}
//WindowsPhone系统
if( $detect->isWindowsPhoneOS()) {
}

另外,本文虽然是为 Typecho 判断设备写的,但是不论 Wordpress/Zblog/Emlog 还是其它系统,只要是基于 PHP 的系统都可以拿来使用。

  • 本文作者:罗格
  • 本文链接:https://www.moidea.info/archives/typecho-function-for-mobile-device.html
  • 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!
  • 客官,说两句吧!

    仅有一条评论

    1. 测试

      测试一下没有头像的情况显示内容