PHP常用的公共函数

/**
 * 字符串截取,支持中文和其他编码
 * static
 * access public
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * return string
 */
function msubstr($str,$length, $suffix=true, $start=0, $charset="utf-8") {
   if(function_exists("mb_substr")){
      $slice = mb_substr($str, $start, $length, $charset);
      $strlen = mb_strlen($str,$charset);
   }elseif(function_exists('iconv_substr')){
      $slice = iconv_substr($str,$start,$length,$charset);
      $strlen = iconv_strlen($str,$charset);
   }else{
      $re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
      $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
      $re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
      $re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
      preg_match_all($re[$charset], $str, $match);
      $slice = join("",array_slice($match[0], $start, $length));
      $strlen = count($match[0]);
   }
   if($suffix && $strlen>$length)$slice.='...';
   return $slice;
}

/**
 * discuz!金典的加密函数原版      需要URL转码   urlencode ( );
 * @param string $string 明文 或 密文
 * @param string $operation DECODE表示解密,其它表示加密
 * @param string $key 密匙
 * @param int $expiry 密文有效期
 */
function authcode($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
   // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
   if($operation == 'DECODE') {   
      $string = str_replace('[a]','+',$string);  
      $string = str_replace('[b]','&',$string);  
      $string = str_replace('[c]','/',$string);  
   }
   $ckey_length = 4;

   // 密匙
   $key = md5($key ? $key : \think\Config::get('auth_key')); // 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('%010d', $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)) {
         return substr($result, 26);
      } else {
         return '';
      }
   } else {
      // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
      // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
      $ustr = $keyc.str_replace('=', '', base64_encode($result));       
      $ustr = str_replace('+','[a]',$ustr);     
      $ustr = str_replace('&','[b]',$ustr);     
      $ustr = str_replace('/','[c]',$ustr);     
      return $ustr;
   }
}

/**
 * 遍历获取目录下的指定类型的文件(ueditor编辑器)
 * @param $path
 * @param array $files
 * @return array
 */
function getfiles($path, $allowFiles, &$files = array())
{
    if (!is_dir($path)) return null;
    if(substr($path, strlen($path) - 1) != '/') $path .= '/';
    $handle = opendir($path);
    while (false !== ($file = readdir($handle))) {
        if ($file != '.' && $file != '..') {
            $path2 = $path . $file;
            if (is_dir($path2)) {
                getfiles($path2, $allowFiles, $files);
            } else {
                if (preg_match("/\.(".$allowFiles.")$/i", $file)) {
                    $files[] = array(
                        'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])),
                        'mtime'=> filemtime($path2)
                    );
                }
            }
        }
    }
    return $files;
}

/**
 * 隐藏字符串
 * @AuthorHTL
 * @DateTime  2016-10-30T14:50:48+0800
 * @param     [type]                   $num   [description]
 * @param     [type]                   $start [description]
 * @param     [type]                   $end   [description]
 * @return    [type]                          [description]
 */
function hid_num($num,$start,$end)
{
   $len =strlen($num);
   $len = $len - ($start +$end);
   $str = str_repeat('*',$len);
   return substr_replace($num,$str,$start,$end);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值