PHP验证终端类型是否为手机的简单实例
代码如下 | 复制代码 |
/** * 判断当前访问的用户是 PC端 还是 手机端 返回true 为手机端 false 为PC 端 * @return boolean */ functionisMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ?$_SERVER['HTTP_USER_AGENT'] :''; //echo $useragent;die; $useragent_commentsblock=preg_match('|\(.*?\)|',$useragent,$matches)>0?$matches[0]:''; functionCheckSubstrs($substrs,$text){ foreach($substrsas$substr) if(false!==strpos($text,$substr)){ returntrue; } returnfalse; } $mobile_os_list=array('Google Wireless Transcoder','Windows CE','WindowsCE','Symbian','Android','armv6l','armv5','Mobile','CentOS','mowser','AvantGo','Opera Mobi','J2ME/MIDP','Smartphone','Go.Web','Palm','iPAQ'); $mobile_token_list=array('Profile/MIDP','Configuration/CLDC-','160×160','176×220','240×240','240×320','320×240','UP.Browser','UP.Link','SymbianOS','PalmOS','PocketPC','SonyEricsson','Nokia','BlackBerry','Vodafone','BenQ','Novarra-Vision','Iris','NetFront','HTC_','Xda_','SAMSUNG-SGH','Wapaka','DoCoMo','iPhone','iPod');
$found_mobile=CheckSubstrs($mobile_os_list,$useragent_commentsblock) || CheckSubstrs($mobile_token_list,$useragent);
if($found_mobile){ returntrue; }else{ returnfalse; } } |
代码如下 | 复制代码 |
classSegmentation { var$options=array('lowercase'=> TRUE, 'segment_english'=> FALSE); var$dict_name='Unknown' var$dict_words=array(); functionsetLowercase($value) { if($value) { $this->options['lowercase'] = TRUE; }else{ $this->options['lowercase'] = FALSE; } returnTRUE; } functionsetSegmentEnglish($value) { if($value) { $this->options['segment_english'] = TRUE; }else{ $this->options['segment_english'] = FALSE; } returnTRUE; } functionload($dict_file) { if(!file_exists($dict_file)) { returnFALSE; } $fp=fopen($dict_file,'r'); $temp=fgets($fp, 1024); if($temp=== FALSE) { returnFALSE; }else{ if(strpos($temp,"\t") !== FALSE) { list ($dict_type,$dict_name) =explode("\t", trim($temp)); }else{ $dict_type= trim($temp); $dict_name='Unknown' } $this->dict_name =$dict_name; if($dict_type!=='DICT_WORD_W') { returnFALSE; } } while(!feof($fp)) { $this->dict_words[rtrim(fgets($fp, 32))] = 1; } fclose($fp); returnTRUE; } functiongetDictName() { return$this->dict_name; } functionsegmentString($str) { if(count($this->dict_words) === 0) { returnFALSE; } $lines=explode("\n",$str); return$this->_segmentLines($lines); } functionsegmentFile($filename) { if(count($this->dict_words) === 0) { returnFALSE; } $lines= file($filename); return$this->_segmentLines($lines); } function_segmentLines($lines) { $contents_segmented='' foreach($linesas$line) { $contents_segmented.=$this->_segmentLine(rtrim($line)) ." \n"; } do{ $contents_segmented=str_replace(' ',' ',$contents_segmented); } while(strpos($contents_segmented,' ') !== FALSE); return$contents_segmented; } function_segmentLine($str) { $str_final='' $str_array=array(); $str_length=strlen($str); if($str_length> 0) { if(ord($str{$str_length-1}) >= 129) { $str.=' ' } } for($i=0;$i<$str_length;$i++) { if(ord($str{$i}) >= 129) { $str_array[] =$str{$i} .$str{$i+1}; $i++; }else{ $str_tmp=$str{$i}; for($j=$i+1;$j<$str_length;$j++) { if(ord($str{$j}) < 129) { $str_tmp.=$str{$j}; }else{ break; } } $str_array[] =array($str_tmp); $i=$j- 1; } } $pos=count($str_array); while($pos> 0) { $char=$str_array[$pos-1]; if(is_array($char)) { $str_final_tmp=$char[0]; if($this->options['segment_english']) { $str_final_tmp= preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f]+)/"," $1 ",$str_final_tmp); $str_final_tmp= preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])/"," $1 $2 ",$str_final_tmp); } if($this->options['lowercase']) { $str_final_tmp=strtolower($str_final_tmp); } $str_final=" $str_final_tmp$str_final"; $pos--; }else{ $word_found= 0; $word_array=array(0 =>''); if($pos< 4) { $word_temp=$pos+ 1; }else{ $word_temp= 5; } for($i=1;$i<$word_temp;$i++) { $word_array[$i] =$str_array[$pos-$i] .$word_array[$i-1]; } for($i=($word_temp-1);$i>1;$i--) { if(array_key_exists($word_array[$i],$this->dict_words)) { $word_found=$i; break; } } if($word_found) { $str_final=" $word_array[$word_found]$str_final"; $pos=$pos-$word_found; }else{ $str_final=" $char$str_final"; $pos--; } } } return$str_final; } } ?> |
小编推荐的这篇文章介绍了php加密之discuz内容经典加密方式实例详解,非常实用,有兴趣的同学快来看看吧。
本文实例讲述了php加密之discuz内容经典加密方式。分享给大家供大家参考,具体如下:
导读:有的时候,我们希望对表里的某些敏感字段进行加密,想了好长时间没有比较好的解决方案,后台在网上查了查,放心discuz论坛的这种方案对这种情况解决的不错,特copy过来,给大家分享一下,代码如下:
代码如下 | 复制代码 |
header ("Content-type:text/html;charset=UTF-8"); echo$string='花园路888号'; echo'<hr/>加密有效期10秒,密文内容:'; // $string='1111'; $sss=authcode($string,'','',10); echo$sss; echo'<hr/>加密后立即解密:...'; echoauthcode($sss); sleep(6); echo'<hr/>6秒后解密...'; $aaaa=authcode($sss); var_dump($aaaa); sleep(5); echo'<hr/>再次5秒后解密...'; $aaaa=authcode($sss); var_dump($aaaa); /** * * @param string $string 明文或密文字符串 * @param string $operation DECODE表示解密,其它表示加密 * @param string $key 密钥 * @param int $expiry 密文有效期,0代码永不过期 * @return string */ functionauthcode($string,$operation='DECODE',$key='',$expiry= 0) { // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 $ckey_length= 4; // 密匙 $key= md5 ($key?$key:$GLOBALS['discuz_auth_key'] ); // 密匙a会参与加解密 $keya= md5 (substr($key, 0, 16 ) ); // 密匙b会用来做数据完整性验证 $keyb= md5 (substr($key, 16, 16 ) ); // 密匙c用于变化生成的密文 $keyc=$ckey_length? ($operation=='DECODE'?substr($string, 0,$ckey_length) :substr( md5 ( microtime () ), -$ckey_length)) :''; // 参与运算的密匙 $cryptkey=$keya. md5 ($keya.$keyc); $key_length=strlen($cryptkey); // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 $string=$operation=='DECODE'?base64_decode(substr($string,$ckey_length) ) : sprintf ('0d',$expiry?$expiry+ time () : 0 ) .substr( md5 ($string.$keyb), 0, 16 ) .$string; $string_length=strlen($string); $result=''; $box= range ( 0, 255 ); $rndkey=array(); // 产生密匙簿 for($i= 0;$i<= 255;$i++) { $rndkey[$i] = ord ($cryptkey[$i%$key_length] ); } // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 for($j=$i= 0;$i< 256;$i++) { $j= ($j+$box[$i] +$rndkey[$i]) % 256; $tmp=$box[$i]; $box[$i] =$box[$j]; $box[$j] =$tmp; } // 核心加解密部分 for($a=$j=$i= 0;$i<$string_length;$i++) { $a= ($a+ 1) % 256; $j= ($j+$box[$a]) % 256; $tmp=$box[$a]; $box[$a] =$box[$j]; $box[$j] =$tmp; // 从密匙簿得出密匙进行异或,再转成字符 $result.=chr( ord ($string[$i] ) ^ ($box[($box[$a] +$box[$j]) % 256]) ); } if($operation=='DECODE') { // substr($result, 0, 10) == 0 验证数据有效性 // substr($result, 0, 10) - time() > 0 验证数据有效性 // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, // 16) 验证数据完整性 // 验证数据有效性,请看未加密明文的格式 if((substr($result, 0, 10 ) == 0 ||substr($result, 0, 10 ) - time () > 0) &&substr($result, 10, 16 ) ==substr( md5 (substr($result, 26 ) .$keyb), 0, 16 )) { returnsubstr($result, 26 ); }else{ return''; } }else{ // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 return$keyc.str_replace('=','',base64_encode($result) ); } } |
以上代码运行结果:
花园路888号
加密有效期10秒,密文内容:ce9eelLd6jpd7hZJTRg+/fgg8cD9VG+1NsHvkavEKhdvhk7jcfDoQTYSAAw
加密后立即解密:...花园路888号
6秒后解密...
string'花园路888号' (length=15)
再次5秒后解密...
string'' (length=0)
本文分享了PHP中生成UUID的自定义函数,有兴趣的同学快来看看吧。UUID 全称是 Universally unique identifier,它是一种识别符,使用任意的计算机都可以生成,不需要一个中央数据库进行管理,即可以保证几乎没有重复的几率。而 UUID 的值域之大,据说给世界上每一粒沙子分配一个 UUID,也不会有重复的。
最近在改 WordPress 的代码,需要用到 UUID。但是,PHP 中居然没有生成 UUID 的函数,只好自己写一个。
代码如下 | 复制代码 |
if(!function_exists('com_create_guid')) { functioncom_create_guid() { returnsprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0x0fff ) | 0x4000, mt_rand( 0, 0x3fff ) | 0x8000, mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) ); } } |
上述代码可以生成一个 UUID version 4。UUID 目前有 5 个版本,其中第四版是完全随机的,生成起来比较容易。而其中的 com_create_guid,是 Windows 中 PHP 的一个函数,它直接调用 COM 的 CreateGuid 函数来生成 UUID,但是在 Linux 没有对应的函数库,只好自己写了。为了方便在不同的平台上使用,就创建了一个同名的函数。其它的代码就是生成随机数了。
至于用法,就直接调用 com_create_guid() 即可。
相关文章
- 支付宝支付在国内算是大家了,我们到处都可以使用支付宝了,下文整理介绍的是在安卓app应用中使用支付宝进行支付的开发例子。 之前讲了一篇博客关与支付宝集成获取...2016-09-20
- PHP+Ajax有许多的功能都会用到它小编今天就有使用PHP+Ajax实现的一个微信登录功能了,下面我们来看一个PHP+Ajax手机发红包的程序例子,具体如下所示。 PHP发红包基本...2016-11-25
php中浮点型(float)和整型(integer)数据类型详解
文章分析了关于php中浮点型(float)和整型(integer)数据类型的用法区别以及在那种情况下会出现数据长度不够。 取值只能为True或者False,当其他类型转化为boolean类...2016-11-25- 很多用安卓智能手机的朋友是用九宫格锁屏,网上也有暴力删除手机图形锁的方法,不过我们可以用程序来破解。本文只提供技术学习,不能干坏事 安卓手机的图形锁(九宫格)...2016-09-20
- 华为手机怎么恢复已卸载的应用?有时候我们在使用华为手机的时候,想知道卸载的应用怎么恢复,这篇文章主要介绍了华为手机恢复应用教程,需要的朋友可以参考下...2020-06-29
- 本篇文章主要是对c#中数据类型占用的字节数进行了详细的介绍。需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
- 这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
- 华为手机怎么开启双时钟?华为手机是可以设置双时钟的,如果来回在两个有时差的地方工作,是可以设置双时钟显示,下面我们就来看看华为添加双时钟的技巧,需要的朋友可以参考下...2020-12-08
安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法
手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21Django def clean()函数对表单中的数据进行验证操作
这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09- 在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
- 虽然Javascript是弱类型语言,但是,它也有自己的几种数据类型,分别是:Number、String、Boolean、Object、Udefined、Null。其中,Object属于复杂数据类型,Object 由无序的键值对组成。其余几种都属于简单数据类型。注意:变量...2015-10-21
- 这篇文章主要介绍了C#泛型类型知识,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-06-25
- 假如现在有这样一个表单,是添加元素用的。<form id='addForm' action='UserAdd.action' type='post'> <label for='uname'>用户名</label>:<input type='text' name='uname' id='uname'><br>...2015-11-24
- 这篇文章主要为大家详细介绍了JavaScript实现密码框输入验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-01
- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 这篇文章主要介绍了vue:el-input输入时限制输入的类型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-05
- 这篇文章主要介绍了Nest.js 授权验证的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
- 这篇文章主要为大家详细介绍了JavaScript实现数据类型的相互转换,感兴趣的朋友可以参考一下...2016-03-09
- 这篇文章主要介绍了el-table树形表格表单验证(列表生成序号),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01