You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

256 lines
7.1 KiB

<?php
/**
* 常用工具库
*/
namespace libraries;
class Util {
/**
* HTML代码过滤
* @param string $str 字符串
* @return string
*/
public static function escapeHtml($str){
$search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript
"'<iframe[^>]*?>.*?</iframe>'si", // 去掉iframe
);
$replace = array ("",
"",
);
$str = preg_replace ($search, $replace, $str);
$str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
return $str;
}
/**
* 获取来访IP
* @return string
*/
public static function getIp(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return $ip;
}
/**
* 中英文字符串截取
* @param string $str 字符串
* @param integer $start 起始长度
* @param integer $length 截取长度
* @param string $charset 字符编码
* @param boolean $suffix 截取后缀
* @return string
*/
public static function msubstr($str, $start = 0, $length, $charset="utf-8", $suffix = true){
if($charset!='utf-8'){
$str = mb_convert_encoding($str,'utf8',$charset);
}
$osLen = mb_strlen($str);
if($osLen <= $length){
return $str;
}
$string = mb_substr($str,$start,$length,'utf8');
$sLen = mb_strlen($string,'utf8');
$bLen = strlen($string);
$sCharCount = (3*$sLen-$bLen)/2;
if($osLen<=$sCharCount+$length){
$arr = preg_split('/(?<!^)(?!$)/u',mb_substr($str,$length+1,$osLen,'utf8')); //将中英混合字符串分割成数组(UTF8下有效)
}else {
$arr = preg_split('/(?<!^)(?!$)/u',mb_substr($str,$length+1,$sCharCount,'utf8'));
}
foreach($arr as $value){
if(ord($value)<128 && ord($value)>0){
$sCharCount = $sCharCount-1;
}else {
$sCharCount = $sCharCount-2;
}
if($sCharCount<=0){
break;
}
$string.=$value;
}
return $string;
if($suffix) return $string."";
return $string;
}
/**
* 判断UTF-8
* @param string $string 字符串
* @return boolean
*/
public static function isUtf8($string){
if( !empty($string) ) {
$ret = json_encode( array('code'=>$string) );
if( $ret=='{"code":null}') {
return false;
}
}
return true;
}
/**
* 字符串转码
* @param string $fContents 字符串
* @param string $from 原始编码
* @param string $to 目标编码
* @return string
*/
public static function auto_charset($fContents,$from='gbk',$to='utf-8'){
$from = strtoupper($from)=='UTF8'? 'utf-8':$from;
$to = strtoupper($to)=='UTF8'? 'utf-8':$to;
if( strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents)) ){
//如果编码相同或者非字符串标量则不转换
return $fContents;
}
if(is_string($fContents) ) {
if(function_exists('mb_convert_encoding')){
return mb_convert_encoding ($fContents, $to, $from);
}elseif(function_exists('iconv')){
return iconv($from,$to,$fContents);
}else{
return $fContents;
}
}
elseif(is_array($fContents)){
foreach ( $fContents as $key => $val ) {
$_key = self::auto_charset($key,$from,$to);
$fContents[$_key] = self::auto_charset($val,$from,$to);
if($key != $_key )
unset($fContents[$key]);
}
return $fContents;
}
else{
return $fContents;
}
}
/**
* 加密函数
* @param mixed $data 加密数据
* @param string $key 密匙
* @param integer $expire 失效时间
* @return string
*/
public static function cpEncode($data, $key='', $expire = 0){
$string=serialize($data);
$ckey_length = 4;
$key = md5($key);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = substr(md5(microtime()), -$ckey_length);
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = sprintf('%010d', $expire ? $expire + 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]));
}
return $keyc.str_replace('=', '', base64_encode($result));
}
/**
* 解密函数
* @param string $string 加密字符串
* @param string $key 密匙
* @return mixed
*/
public static function cpDecode($string,$key=''){
$ckey_length = 4;
$key = md5($key);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = substr($string, 0, $ckey_length);
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = base64_decode(substr($string, $ckey_length));
$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((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return unserialize(substr($result, 26));
}else{
return '';
}
}
/**
* 删除目录所有文件
* @param string $dir 路径
* @return boolean
*/
public static function delDir($dir){
if (!is_dir($dir)){
return false;
}
$handle = opendir($dir);
while (($file = readdir($handle)) !== false){
if ($file != "." && $file != ".."){
is_dir("$dir/$file")? self::delDir("$dir/$file") : @unlink("$dir/$file");
}
}
if (readdir($handle) == false){
closedir($handle);
@rmdir($dir);
}
}
}