/** * 将数值三位分割,加千分位的分隔符(多用于钱数,金额) * @param $count * @return mixed */ function formatCount($count){ if($count/1000 >= 1){ $count = preg_replace('/(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))/', ',', $count); } return $count; } /** * 阿拉伯数字转中文大写金额 * @param $num * @param bool|true $mode 模式(true 元 / false 点) * @param bool|true $sim 中文大小写(true 一 / false 壹) * @return string */ function numToCNMoney($num, $mode = true, $sim = true){ if(!is_numeric($num)) return '含有非数字非小数点字符!'; $char = $sim ? ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] : ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; $unit = $sim ? ['', '十', '百', '千', '', '万', '亿', '兆'] : ['', '拾', '佰', '仟', '', '萬', '億', '兆']; $retval = $mode ? '元' : '点'; //小数部分 if(strpos($num, '.')){ list($num,$dec) = explode('.', $num); $dec = strval(round($dec,2)); if($mode){ $retval .= "{$char[$dec['0']]}角{$char[$dec['1']]}分"; }else{ for($i = 0,$c = strlen($dec);$i < $c;$i++) { $retval .= $char[$dec[$i]]; } } } //整数部分 $str = $mode ? strrev(intval($num)) : strrev($num); for($i = 0,$c = strlen($str);$i < $c;$i++) { $out[$i] = $char[$str[$i]]; if($mode){ $out[$i] .= $str[$i] != '0'? $unit[$i%4] : ''; if($i>1 and $str[$i]+$str[$i-1] == 0){ $out[$i] = ''; } if($i%4 == 0){ $out[$i] .= $unit[4+floor($i/4)]; } } } $retval = join('', array_reverse($out)) . $retval; return $retval; } /** * 获取在线IP * @return string */ function getIP(){ $ip="0.0.0.0"; if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } preg_match("/[\d\.]{7,15}/", $ip, $onlineipmatches); $ip = $onlineipmatches[0] ? $onlineipmatches[0] : '0.0.0.0'; unset($onlineipmatches); return $ip; } /** * 手机号隐藏(指定位置用星号'*'或特殊字符代替) * @param $mobile 手机号 * @param string $symbol 替代符 * @param int $start 开始位置 * @param int $length 替换长度 * @return mixed * @example hideMobile('18161295668', '*', 3, 5); */ function hideMobile($mobile, $symbol = '*', $start = 1, $length = 1){ $nsymbol = $symbol; $len = strlen($mobile); if(($len > $length) && (($start + $length) <= $len)){ for($i = 0; $i < $length - 1; $i++){ $nsymbol .= '*'; } $mobile = substr_replace($mobile, $nsymbol, $start, $length); } return $mobile; } /** * 判断url是否带参数并返回连接符 * @param string $url 网址字串 * @return string 返回参数连接符 ? 或 & */ function getSymbol($url){ return ((strpos($url, '?') !== false) ? '&' : '?'); } /** * 判断url是否带有井号(#) * @param $url 网址字串 * @return bool */ function hasHash($url){ return ((strpos($url, '#') !== false) ? true : false); } /** * 从网址字串中获取参数值 * @param $url 网址字串 * @return array 参数及参数值数组 */ function getUrlStrParam($url){ $data = array(); $param = explode('?', $url); $parameter = explode('&', end($param)); foreach($parameter as $val){ $tmp = explode('=', $val); if(isset($tmp[0]) && isset($tmp[1])){ $data[$tmp[0]] = $tmp[1]; } } return $data; } /** * 从网址字串中获取文件名 * @param string $url 网址字串 * @return string */ function getUrlStrFileName($url){ $expSprit = explode('/', $url); $fileName = end($expSprit); //将数组内部指针指向最后一个元素,并返回该元素的值(如果成功) if(strpos($url, '?') !== false){ //带参数 $expQue = explode('?', $fileName); $fileName = reset($expQue); //将数组内部指针指向第一个元素,并返回该元素的值(如果成功) }else{ if(hasHash($fileName)){ //带井号 $expHash = explode('#', $fileName); $fileName = reset($expHash); } } return $fileName; } /** * 获取文件扩展名 * @param string $FileName 文件全名 * @return string */ function getFileExt($fileName){ $expDot = explode('.', $fileName); $fileExt = array_pop($expDot); //删除数组中的最后一个元素 //$fileExt = end($expDot); //将数组内部指针指向最后一个元素 array_pop 、 end 返回结果一样 $fileExt = trim($fileExt); $fileExt = '.' . strtolower($fileExt); return $fileExt; } /** * 铭感词过滤 加空格 * @param $dirtyFile 铭感词文件路径 * @param $string 原字串 * @return mixed|string */ function filterBadWords($dirtyFile, $string){ $dirtyWord = file_get_contents($dirtyFile); //说明:铭感词之间以英文逗号,分隔并且是base64字串 $keyArr = explode(',', base64_decode($dirtyWord)); //base64解码并将字符分割为数组 preg_match_all("/./us", $string, $match); $strLen = count($match[0]); //原字符长度(字符个数) $strNum = 0; $newStr = ''; foreach($keyArr as $key){ if(strpos($string, $key) !== false){ $num = substr_count($string, $key); //计算字串出现的次数 preg_match_all("/./us", $key, $_match); $keyLen = count($_match[0]); $nkey = mb_substr($key, 0, $keyLen-1, 'utf-8') . ' '. mb_substr($key, $keyLen-1, $keyLen, 'utf-8'); $newStr .= str_replace($key, $nkey, $string); //替换字符 $newStr = str_replace($key, $nkey, $newStr); $strNum += $num; } } $newStr = mb_substr($newStr, 0, $strLen+$strNum, 'utf-8'); return empty($newStr) ? $string : $newStr; } /** * 检测字串中是否存在某些字符 * @param $str 字符串 * @param $fstr 要查找的字符(多个用,隔开) * @return bool */ function strExists($str, $fstr){ if(!is_string($str)){ die('The first parameter is not a string.'); } $keyArr = explode(',', $fstr); //将字符分割为数组 $i = 0; foreach($keyArr as $key){ if(strpos($str, $key) !== false){ $i++; } } return ($i > 0) ? true : false; } /** * 计算中文字符串长度 字符个数(非字节数) * @param null $string * @return int */ function utf8StrLen($string = null) { preg_match_all("/./us", $string, $match); //将字符串分解为单元 return count($match[0]); //返回单元个数 } /** * 检测是否有连续的字符 * @param $str 字符串 * @param $len 连续长度 * @return bool */ function seriesExists($str, $len){ return (preg_match("/([\x{4e00}-\x{9fa5}])\\1{".($len-1).",}/u", $str) == 1) ? true : false; } /** * 删除所有空目录 * 使用shell则简单很多:find 目标文件夹 -mindepth 1 -depth -empty -type d -exec rm -r {} \; * @param $path */ function rmEmptyDir($path){ if(is_dir($path) && ($handle = opendir($path))!==false){ while(($file=readdir($handle))!==false){// 遍历文件夹 if($file!='.' && $file!='..'){ $curfile = $path.'/'.$file;// 当前目录 if(is_dir($curfile)){// 目录 rm_empty_dir($curfile);// 如果是目录则继续遍历 if(count(scandir($curfile))==2){//目录为空,=2是因为.和..存在 rmdir($curfile);// 删除空目录 } } } } closedir($handle); } } /** * 文件或目录权限检查函数 * @param $filePath 文件路径 * @return bool|int 返回值的取值范围为{0 <= x <= 15},每个值表示的含义可由四位二进制数组合推出。 * 返回值在二进制计数法中,四位由高到低分别代表 * 可执行rename()函数权限、可对文件追加内容权限、可写入文件权限、可读取文件权限。 */ function fileModeInfo($filePath){ //如果不存在,则不可读、不可写、不可改 if(!file_exists($filePath)){ return false; } $mark = 0; if(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'){ //测试文件 $testFile = $filePath . '/cf_test.txt'; //如果是目录 if(is_dir($filePath)){ //检查目录是否可读 $dir = @opendir($filePath); if($dir === false){ return $mark; //如果目录打开失败,直接返回目录不可修改、不可写、不可读 } if(@readdir($dir) !== false){ $mark ^= 1; //目录可读 001,目录不可读 000 } @closedir($dir); //检查目录是否可写 $fp = @fopen($testFile, 'wb'); if($fp === false){ return $mark; //如果目录中的文件创建失败,返回不可写。 } if(@fwrite($fp, 'directory access testing.') !== false){ $mark ^= 2; //目录可写可读011,目录可写不可读 010 } @fclose($fp); @unlink($testFile); //检查目录是否可修改 $fp = @fopen($testFile, 'ab+'); if($fp === false){ return $mark; } if(@fwrite($fp, "modify test.\r\n") !== false){ $mark ^= 4; } @fclose($fp); //检查目录下是否有执行rename()函数的权限 if(@rename($testFile, $testFile) !== false){ $mark ^= 8; } @unlink($testFile); } //如果是文件 elseif (is_file($filePath)){ //以读方式打开 $fp = @fopen($filePath, 'rb'); if($fp){ $mark ^= 1; //可读 001 } @fclose($fp); //试着修改文件 $fp = @fopen($filePath, 'ab+'); if($fp && @fwrite($fp, '') !== false){ $mark ^= 6; //可修改可写可读 111,不可修改可写可读011... } @fclose($fp); //检查目录下是否有执行rename()函数的权限 if(@rename($testFile, $testFile) !== false){ $mark ^= 8; } } }else{ if(@is_readable($filePath)){ $mark ^= 1; } if(@is_writable($filePath)){ $mark ^= 14; } } return $mark; } /** * 读取CSV文件中的某几行数据 * @param $csvFile csv文件路径 * @param $lines 读取行数 * @param int $offset 起始行数 * @return array|bool */ function csvGetLines($csvFile, $lines, $offset = 0) { if(!$fp = fopen($csvFile, 'r')) { return false; } $i = $j = 0; while (false !== ($line = fgets($fp))) { if($i++ < $offset) { continue; } break; } $data = array(); while(($j++ < $lines) && !feof($fp)) { $data[] = fgetcsv($fp); } fclose($fp); return $data; } /** * 二维数组数据分组聚合 * @param $arr 数据数组 * @param $gkey 分组键值 * @return array */ function arrayGroup($arr, $gkey){ $kArr = array(); $gArr = array(); $nArr = array(); foreach($arr as $key => $val){ if(!in_array($val[$gkey], $kArr)){ $ukey = count($kArr); $kArr[] = $val[$gkey]; $gArr[$ukey][] = $val; }else{ $ukey = array_search($val[$gkey], $kArr); $gArr[$ukey][] = $val; } } foreach($gArr as $key => $val){ if(is_array($val)){ foreach($val as $k => $v){ array_push($nArr, $v); } } } return $nArr; } /** * 字符加密、解密(解密必须知道加密秘钥,否则无法解密) * @param $string 字符串 * @param string $type 类型(E加密 / D解密) * @param string $key 秘钥 * @return mixed|string */ function encrypt($string, $type = 'E', $key = '') { $key = md5($key); $key_length = strlen($key); $string = $type == 'D' ? base64_decode($string) : substr(md5($string.$key),0,8).$string; $string_length = strlen($string); $rndkey = $box = array(); $result = ''; for($i=0; $i<=255; $i++){ $rndkey[$i] = ord($key[$i%$key_length]); $box[$i] = $i; } 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($type=='D'){ if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){ return substr($result,8); }else{ return ''; } }else{ return str_replace('=','',base64_encode($result)); } }
共 0 条评论