<?php 
namespace imcat;

/* string,array,file:解析类
 * serial : serEncode
 * json : jsonFormat,jsonDecode,jsonEncode,
 * xml(node): nodeParse
 * csv: csvPuts,csvGets
*/

// 编码转化,加密类
class comParse{    

    
// 适合把中文用base64编码用于url传输(比url编码短,且都是安全字符),获取时用这个来解码
    // $s : 原字符串, 支持数组
    // $de : 0-编码, 1-解码, a-解码返回数组
    
static function urlBase64($s,$de=0,$chrs=''){
        
$a2 $chrs $chrs "-_"// "-_" , ".~"; //《!()+,-.;@^_`~》安全13个
        
if(is_array($s)) $s basElm::arr2text($s,"\n",'=');
        if(
$de){
            
$s str_pad(strtr($s,$a2,"+/"),strlen($s)%4,'=',STR_PAD_RIGHT);
            
$s base64_decode($s);
            if(
$de=='a'$s basElm::text2arr($s); 
        }else{
            
$s base64_encode($s);
            
$s rtrim(strtr($s,"+/",$a2),'=');
        }
        return 
$s;
    }
    
// urlEncode,不转化中文 : 《:/?=&#%》URL 《"&<>》HTML
    
static function urlEncode($str,$ext=0,$percent=0){ //url,ext,percent
        
if($percent){
            
$str str_replace('%','%25',$str);
        } 
        
$a = array( '#'   '&' ); 
        
$b = array( '%23' '%26' ); 
        
$str str_replace($a,$b,$str);
        
// $str = str_replace(array(' ','<','>','"',"'","\r","\n"),'',$str);, 不是参数
        
$c = array( '+'   ' ' '"'   ,"'"   '<'   '>'   "\r"  "\n"  "\\"  );
        
$d = array( '%2B' '+' '%22' ,'%27' '%3C' '%3E' '%0D' '%0A' '%5C' );
        if(
$ext){
            
$str str_replace($c,$d,$str);
        }
        return 
$str;
    }
    
    
// csv 
    
static function csvGets($file) {
        
$handle fopen($file,'r'); 
        
$arr = array();
        while (
$data fgetcsv($handle)) { //每次读取CSV里面的一行内容  
            
$arr $data//此为一个数组,要获得每一个数据,访问数组下标即可  
        
}  
        
fclose($handle); 
        return 
$arr;
    }
    static function 
csvPuts($file$data) {
        
$handle fopen($file'r+');
        foreach (
$data as $line) {
            
fputcsv($handle$line);
        }
        
fclose($handle);
    }

    
// xml(node)
    
static function nodeParse($data$cset=''$nobj=''$opt=LIBXML_NOCDATA) {
        if(
is_string($data)){
            
$hfix $cset "<?xml version='1.0' encoding='$cset'?>" '';
            
$data simplexml_load_string($hfix.$datanull$opt); // obj(自动转:utf-8)
        
}
        
$json json_encode($data);
        if(
$nobj==''){ // 空对象转化为空字符串
            
$json str_replace(['":{},','":{}}'], ['":"",','":""}'], $json);
        }
        
$arr json_decode($jsontrue);
        return 
$arr;
    }
    
    
// 将数组转换为JSON字符串(兼容中文)
    
static function jsonEncode($array) {
        
$pmj defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE 0;
        
$json = @json_encode($array$pmj); // JSON_UNESCAPED_UNICODE:PHP>=5.4生效
        
$json str_replace("\"},\"","\"}\n,\"",$json);
        
$json str_replace(",\",\"",",\"\n,\"",$json);
        return 
$json;
    }
    static function 
jsonDecode($str) { 
        
$str comFiles::killBOM($str);
        
$str trim($str); 
        
$arr json_decode($str,1);
        return 
$arr;
    }

    
// 反序列化(将某些特殊字符的utf8编码转为asc码解析)不建议使用原生的unserialize。
    
static function serEncode($str) { 
        
$str str_replace("\r"""$str);
        
#$str = preg_replace('/s:(\d+):"(.*?)";/se', '"s:".strlen("$2").":\"$2\";"', $str);
        
$str preg_replace_callback('/s:(\d+):"(.*?)";/s', function($arr){
            return 
's:'.strlen($arr[2]).':"'.$arr[2].'";';
        }, 
$str);
        return 
unserialize($str); 
    }

    
# fix: %u, &#
    
private function uniEncode($str$fix='%u'){
        
preg_match_all('/./u'$str$matches);
        
$reStr "";
        foreach(
$matches[0] as $m){
            
$itm bin2hex(iconv('UTF-8',"UCS-4",$m));
            
$reStr .= $fix.strtoupper(substr($itm,4));
        }
        return 
$reStr;
    }

    
// unicode 
    
static function uniDecode($str$type='u'){
        if(
$type=='u'){ // '\u4E00'
            
$reg '/\\\\u([0-9a-f]{4})/i';
        }else{ 
// '&#x4E00'
            
$reg '/\&\#x([0-9a-f]{4})\;/i';
        }
        
$str preg_replace_callback($reg, function($arr){
            return 
mb_convert_encoding(pack('H*'$arr[1]), 'UTF-8''UCS-2BE');
        },  
$str);
        return 
$str;
    }

}