最近做一个手机查询系统,自然就牵扯到了此问题,那我就根据对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的访问进行了判断,然后直接跳转
使用以上代码判断,经测试效果很好。
自己用的一个判断类,比较全面了
代码如下 | 复制代码 |
/* |
下面这个函数是一个php 打印出字符串的16进制实例,这里面的核心函数就是 chr获取二进制然后再进行转成16进制数。
代码如下 | 复制代码 |
<?php
|
php在操作字符串的问题时间无非两个问题:
1.判断字符串编码是gbk还是unicode。
2.对相应编码采取相应截取方法。
一般情况下我们使用substr截取汉字可能会遇到乱码问题。因为汉字是双字节的,当被截取了一个字节时,这个汉字就无法显示,乱掉了。
其实解决很简单,看下面的截取函数:
代码如下 | 复制代码 |
//截取超长字符串 |
上面的chr(0)不是null
null是什么都没有,而chr(0)的值是0。表示成16进制是0×00,表示成二进制是00000000
虽然chr(0)不会显示出什么,但是他是一个字符。
当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0×81到0xff与0×00组合始终都显示为“空”
根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了
下面补充几个函数即可实现此两点以达到精确截取中文字符串的目的:
截取utf8编码的多字节字符串
代码如下 | 复制代码 |
<?php |
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'); ?> |
近负责的一个系统模块终于可以说是接近尾声了,余下的工作就是配合测试们测试和修改了。
趁着这个相对比较闲的时间里,偷偷写几篇博文记录下这个时间段遇到的问题和我的解决方案(还是说解决方法吧)。
好了,废话不多说,进入正题。
有这种需求的一般都是去小偷程序那些,像去掉原页面的链接什么的。不过,我遇到的是要导出制定页面到word,安全起见需要去掉js代码块。
先上代码
代码如下 | 复制代码 |
$searchRegex = array( |
php的话这个就比较简单了,就是使用了preg_replace这个函数啦,不多说。。。需要注意的是两个正则吧,这个才是关键。
代码如下 | 复制代码 |
$regexForLink = '/<as*.*?s*>(s*.*?s*)</a>/i'; // 超链接 |
如果要过滤HTML代码、空格、回车换行符
代码如下 | 复制代码 |
|
过滤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; |