php如何判断用户通过手机wap访问还是电脑直接访问

 更新时间:2016年11月25日 17:25  点击:1894
现在我们智能手机用户很多了,访问网站也有很多朋友使用手机直接访问,这样存在问题了如果是pc版本手机访问肯定不好看还费人家流量了,所以很多公司做了wap站了,但是要如何判断用户是手机还是pc访问网站呢,下面我整理了一些方法。

最近做一个手机查询系统,自然就牵扯到了此问题,那我就根据对wap的认识浅谈下通过php判断用户访问方式是通过wap访问还是电脑直接访问。
首先说最根本的解决方法:
手机访问时,会附带发送user-agent信息,这个信息里面会有手机号码信息,那么如果能取得手机号码,则可以肯定是通过手机wap访问的。但是目前中国移动已经屏蔽了user-agent信息,所以获取不到手机号码。有关系的朋友可以联系移动公司,把wap网站服务器的ip提交给中国移动,加入白名单后即可取得ua信息。目前中国联通可以直接取到手机号,对联通用户此方案可完美实施。
接下来说我的解决方案:
手机访问,原理是手机通过移动公司的代理服务器进行的访问。那么我们就可以理解是一台普通电脑使用了代理服务器。当手机通过代理服务器访问的时候,http头信息会毫无疑问的包含一个信息:via。这个信息提供了有价值的判断信息。
例如河南移动取得的via信息是:
http/1.1 hazz-b-gw001-wap(infox-wisg, huawei technologies)
河南联通的via信息是:
zxwap gateway,zte technologies
其他各省的http头信息和这个大同小异,判断是否手机访问的方案就出来了:获取http的via信息字符串看是否包含wap字符,如果有则是通过手机访问。这样做的结果是没有人能伪造手机访问,判断绝对准确。自然,这样对于网上流行的手机wap模拟器也做了屏蔽----从根本上屏蔽。
操作代码也很简单:

 代码如下 复制代码
// check if wap by xhat
function check_wap() {
return stristr($_SERVER['HTTP_VIA'],"wap") ? true : false;
}
// check over

从我查阅的资料来看,目前此方法应该是迄今互联网上准确率最高、最简单的判断手机访问方法。

iphone智能手机

为discuz做的iphone版本基本完工,为了方便访问,直接在首页对iphone的访问进行了判断,然后直接跳转

使用以上代码判断,经测试效果很好。

自己用的一个判断类,比较全面了

 代码如下 复制代码

/*
 判断访问用户是否为手机111cn.net
 //判断是否属手机
 */
 function is_mobile() {
  $user_agent = strtolower( $_SERVER['HTTP_USER_AGENT'] );
  //echo $user_agent;
  $mobile_agents = Array("ipad","wap","android","iphone","sec","sam","ericsson","240x320","acer","acoon","acs-","abacho","ahong","airness","alcatel","amoi","anywhereyougo.com","applewebkit/525","applewebkit/532","asus","audio","au-mic","avantogo","becker","benq","bilbo","bird","blackberry","blazer","bleu","cdm-","compal","coolpad","danger","dbtel","dopod","elaine","eric","etouch","fly ","fly_","fly-","go.web","goodaccess","gradiente","grundig","haier","hedy","hitachi","htc","huawei","hutchison","inno","ipaq","ipod","jbrowser","kddi","kgt","kwc","lenovo","lg","lg2","lg3","lg4","lg5","lg7","lg8","lg9","lg-","lge-","lge9","longcos","maemo","mercator","meridian","micromax","midp","mini","mitsu","mmm","mmp","mobi","mot-","moto","nec-","netfront","newgen","nexian","nf-browser","nintendo","nitro","nokia","nook","novarra","obigo","palm","panasonic","pantech","philips","phone","pg-","playstation","pocket","pt-","qc-","qtek","rover","sagem","sama","samu","sanyo","samsung","sch-","scooter","sec-","sendo","sgh-","sharp","siemens","sie-","softbank","sony","spice","sprint","spv","symbian","tcl-","teleca","telit","tianyu","tim-","toshiba","tsm","up.browser","utec","utstar","verykool","virgin","vk-","voda","voxtel","vx","wellco","wig browser","wii","windows ce","wireless","xda","xde","zte","ben","hai","phili");
  $is_mobile = false;
  foreach ($mobile_agents as $device) {
   if (stristr($user_agent, $device)) {
    if( 'ipad' == $device )
    {
     return $is_mobile;
    }
    $is_mobile = true;
    break;
   }
  }
  return $is_mobile;
 }

 

下面这个函数是一个php 打印出字符串的16进制实例,这里面的核心函数就是 chr获取二进制然后再进行转成16进制数。
 代码如下 复制代码

<?php
/*
php 打印出字符串的16进制数据
*/
function hex_dump($data, $newline="n")
{
  static $from = '';
  static $to = '';
 
  static $width = 16; # number of bytes per line
 
  static $pad = '.'; # padding for non-visible characters
 
  if ($from==='')
  {
    for ($i=0; $i<=0xFF; $i++)
    {
      $from .= chr($i);
      $to .= ($i >= 0x20 && $i <= 0x7E) ? chr($i) : $pad;
    }
  }
 
  $hex = str_split(bin2hex($data), $width*2);
  $chars = str_split(strtr($data, $from, $to), $width);
 
  $offset = 0;
  foreach ($hex as $i => $line)
  {
    echo sprintf('%6X',$offset).' : '.implode(' ', str_split($line,2)) . ' [' . $chars[$i] . ']' . $newline;
    $offset += $width;
  }
}
 
$info="this is a testx00x99hex_dump";
print_r(hex_dump($info));
/*
输出结果:
 
0 : 74 68 69 73 20 69 73 20 61 20 74 65 73 74 00 99 [this is a test..]
 
10 : 68 65 78 5f 64 75 6d 70 [hex_dump]
*/
?>


 

汉字中文使用php自带函数截取有时会碰到有问号了,下面我们整理了几个非常不错的汉字中文精确截取实例。

php在操作字符串的问题时间无非两个问题:
1.判断字符串编码是gbk还是unicode。
2.对相应编码采取相应截取方法。

一般情况下我们使用substr截取汉字可能会遇到乱码问题。因为汉字是双字节的,当被截取了一个字节时,这个汉字就无法显示,乱掉了。

其实解决很简单,看下面的截取函数:

 代码如下 复制代码

//截取超长字符串
function curtStr($str,$len=30){
 if(strlen($str)>$len){
  $str = substr($str,0,$len);
  $str .= chr(0) ."…";
 return $str;
}

上面的chr(0)不是null
null是什么都没有,而chr(0)的值是0。表示成16进制是0×00,表示成二进制是00000000
虽然chr(0)不会显示出什么,但是他是一个字符。
当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0×81到0xff与0×00组合始终都显示为“空”
根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了

下面补充几个函数即可实现此两点以达到精确截取中文字符串的目的:

截取utf8编码的多字节字符串

 代码如下 复制代码

   <?php  
   //截取utf8字符串  
   function utf8Substr($str, $from, $len)  
   {  
      return preg_replace('#^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$from.'}'.  
                         '((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$len.'}).*#s',  
                         '$1',$str);  
   }  
   ?>

UTF-8、GB2312都支持的汉字截取函数

 代码如下 复制代码
 <?php  
    /*  
    Utf-8、gb2312都支持的汉字截取函数  
    cut_str(字符串, 截取长度, 开始长度, 编码);  
    编码默认为 utf-8  
    开始长度默认为 0  
    */   
 
    function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')   
   {   
      if($code == 'UTF-8')   
      {   
          $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";   
          preg_match_all($pa, $string, $t_string);   
 
          if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."...";   
          return join('', array_slice($t_string[0], $start, $sublen));   
      }   
      else   
      {   
          $start = $start*2;   
          $sublen = $sublen*2;   
          $strlen = strlen($string);   
          $tmpstr = '';   
 
         for($i=0; $i<$strlen; $i++)   
          {   
              if($i>=$start && $i<($start+$sublen))   
              {   
                  if(ord(substr($string, $i, 1))>129)   
                  {   
                      $tmpstr.= substr($string, $i, 2);   
                  }   
                  else   
                  {   
                      $tmpstr.= substr($string, $i, 1);   
                  }   
              }   
              if(ord(substr($string, $i, 1))>129) $i++;   
          }   
          if(strlen($tmpstr)<$strlen ) $tmpstr.= "...";   
          return $tmpstr;   
      }   
   }   
 
   $str = "abcd需要截取的字符串";   
   echo cut_str($str, 8, 0, 'gb2312');   
   ?>
在php中要过滤一些特殊字符或非法字符我们可以有很多的办法,像正则表达式str_replace就是一个不错的办法,像回车,空格,换行都可以用它来解决。

近负责的一个系统模块终于可以说是接近尾声了,余下的工作就是配合测试们测试和修改了。

趁着这个相对比较闲的时间里,偷偷写几篇博文记录下这个时间段遇到的问题和我的解决方案(还是说解决方法吧)。

 好了,废话不多说,进入正题。

    有这种需求的一般都是去小偷程序那些,像去掉原页面的链接什么的。不过,我遇到的是要导出制定页面到word,安全起见需要去掉js代码块。

    先上代码

 代码如下 复制代码

   

    $searchRegex = array(
    '/<as*.*?s*>(s*.*?s*)</a>/i', // 超链接
    '/<scripts*.*?s*>[sS]*?</script>/i', // JS脚本代码
    );
    $replaceStr = array(
    '$1',
    ''
    );
    $content = preg_replace($searchRegex, $replaceStr, $content);


php的话这个就比较简单了,就是使用了preg_replace这个函数啦,不多说。。。需要注意的是两个正则吧,这个才是关键。

 代码如下 复制代码

    $regexForLink = '/<as*.*?s*>(s*.*?s*)</a>/i'; // 超链接
    $regexForJS = '/<scripts*.*?s*>[sS]*?</script>/i'; // JS脚本代码

如果要过滤HTML代码、空格、回车换行符

 代码如下 复制代码


function DeleteHtml($str)
{
$str = trim($str);
$str = strip_tags($str,"");
$str = ereg_replace("t","",$str);
$str = ereg_replace("rn","",$str);
$str = ereg_replace("r","",$str);
$str = ereg_replace("n","",$str);
$str = ereg_replace(" "," ",$str);
return trim($str);
}


过滤html中所有html标签可以使用strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。

strip_tags(string,allow)

好了,就这么多,希望下一次有帮助吧。

mysql服务器中mysql与information_schema数据库是系统数据库了,这个对于我们来讲几乎没什么多大的用处,但我们是不能删除他们的他们是关键的,那么要如何隐藏mysql与information_schema数据库呢,下面我们一起来看看隐藏它们的方法。

本文收集内容:

• phpMyAdmin隐藏多个数据库(information_schema|mysql|test)
• phpMyAdmin禁止/不允许用户修改密码

phpMyAdmin隐藏多个数据库 information_schema|mysql|test

编辑/libraries/config.default.php

隐藏单个数据库:

 代码如下 复制代码

$cfg['Servers'][$i]['hide_db'] = 'information_schema'

隐藏多个数据库:

 代码如下 复制代码

$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql|test)'

#如果想要隐藏全部以hf开头的数据库,可以使用'^hf',如果想隐藏一个列表,可以使
用'(database|database|...)'的形式

#补充:3.3.3以上版本

phpMyAdmin禁止/不允许用户修改密码

 代码如下 复制代码

$cfg['ShowChgPassword'] = false;

[!--infotagslink--]

相关文章

  • 安卓手机app添加支付宝支付开发教程

    支付宝支付在国内算是大家了,我们到处都可以使用支付宝了,下文整理介绍的是在安卓app应用中使用支付宝进行支付的开发例子。 之前讲了一篇博客关与支付宝集成获取...2016-09-20
  • PHP+Ajax手机发红包的程序例子

    PHP+Ajax有许多的功能都会用到它小编今天就有使用PHP+Ajax实现的一个微信登录功能了,下面我们来看一个PHP+Ajax手机发红包的程序例子,具体如下所示。 PHP发红包基本...2016-11-25
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • 华为手机怎么恢复已卸载的应用?华为手机恢复应用教程

    华为手机怎么恢复已卸载的应用?有时候我们在使用华为手机的时候,想知道卸载的应用怎么恢复,这篇文章主要介绍了华为手机恢复应用教程,需要的朋友可以参考下...2020-06-29
  • 破解安卓手机上的九宫格锁方法步骤

    很多用安卓智能手机的朋友是用九宫格锁屏,网上也有暴力删除手机图形锁的方法,不过我们可以用程序来破解。本文只提供技术学习,不能干坏事 安卓手机的图形锁(九宫格)...2016-09-20
  • 华为手机怎么开启双时钟? 华为添加双时钟的技巧

    华为手机怎么开启双时钟?华为手机是可以设置双时钟的,如果来回在两个有时差的地方工作,是可以设置双时钟显示,下面我们就来看看华为添加双时钟的技巧,需要的朋友可以参考下...2020-12-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • php根据用户语言跳转相应网页

    当来访者浏览器语言是中文就进入中文版面,国外的用户默认浏览器不是中文的就跳转英文页面。 <&#63;php $lan = substr(&#8194;$HTTP_ACCEPT_LANGUAGE,0,5); if ($lan == "zh-cn") print("<meta http-equiv='refresh' c...2015-11-08
  • php有效防止同一用户多次登录

    【问题描述】:同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢? 【解决方案】 (1) 每次登录,身份认证成功后,重新产生一个session_id。 s...2015-11-24
  • js检测用户输入密码强度

    一个用Javascript检测用户输入密码强度的效果代码,以下代码主要是从以下四个方面检测用户输入的密码的强度的,有兴趣的朋友可以自己添加或修改成自己想要的形式! 1. 如果输入的密码位数少于5位,那么就判定为弱。 2. 如果...2015-10-23
  • php ajax注册验证用户名是否存在代码

    这是注册程序是一款当用户输入完用户名是,就会自动去数据库中查询用户要注册的用户名是否己经被注册了,如果是返回提示否则提示可以注册。 conn.php文件 代...2016-11-25
  • oppo r9s怎么连接电脑 oppo r9s正确连接电脑方法教程

    OPPO R9s怎么打开USB调试连接电脑呢?安卓手机要连接电脑,就必须先激活开启USB调试模式,不过基于Android 6.0深度定制的ColorOS 3.0系统默认usb调试是隐藏的,初次开启需要...2016-12-21
  • 华为手机蓝牙可以连接几个设备?华为设置蓝牙音频连接个数的技巧

    华为手机蓝牙可以连接几个设备? 华为手机使用蓝牙的时候,想要知道能连接几个设备,这都是可以设置呢?下面我们就来看看华为设置蓝牙音频连接个数的技巧,需要的朋友可以参考下...2020-12-08
  • 小米手机负一屏该怎么设置? 如何使用小米手机负一屏

    小米手机负一屏该怎么设置?小米手机最近推出了负一屏的功能,集成了很多信息,可以放一些需要知道的信息,下面我们就来看看详细的教程,需要的朋友可以参考下。 最新的开...2016-12-15
  • oppo手机怎么设置充电提示音 oppo手机充电提示音设置方法

    oppo手机充电提示音怎么关闭?用户要学会充电提示音的设置方法,这样才能熟练的操作更换提示音或者是关掉提示音,关于OPPO手机充电提示音的设置下面会有具体的介绍,各位用户一起来看看详细的操作方法吧...2020-12-08
  • 钉钉怎么双开登录两个账号? 小米手机双开钉钉的技巧

    钉钉怎么双开登录两个账号?钉钉中想要双开登录两个账号,该怎么登录呢?下面我们就来看看小米手机双开钉钉的技巧,需要的朋友可以参考下...2020-06-29
  • 保千里打令VR手机怎么样?什么时候发布?

    保千里打令VR手机怎么样?什么时候发布?全球首款VR手机保千里打令VR手机将于10月24日在深圳大梅沙国际水上运动中心隆重发布,对保千里打令VR手机不太了解朋友可以看看...2016-11-01
  • 微信小程序用户授权最佳实践指南

    这篇文章主要给大家介绍了关于微信小程序用户授权最佳实践的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-08
  • 手机配置那么高为什么玩王者荣耀还会卡?

    明明我的手机配置那么高(都八核了)为什么玩游戏还会卡?对安卓手机来说玩游戏卡顿的原因一般有两种;性能不足导致的卡顿以及CPU发热降频导致的卡顿,详情我们来看看吧...2017-07-06