/** * global.func.php 公共函数库 * * @copyright (C) 2005-2010 PHPCMS * @license http://www.phpcms.cn/license/ * @lastmodify 2010-6-1 */ /** * 返回经addslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed */ function new_addslashes($string){ if(!is_array($string)) return addslashes($string); foreach($string as $key => $val) $string[$key] = new_addslashes($val); return $string; } /** * 返回经stripslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed */ function new_stripslashes($string) { if(!is_array($string)) return stripslashes($string); foreach($string as $key => $val) $string[$key] = new_stripslashes($val); return $string; } /** * 返回经htmlspecialchars处理过的字符串或数组 * @param $obj 需要处理的字符串或数组 * @return mixed */ function new_html_special_chars($string) { $encoding = 'utf-8'; if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15'; if(!is_array($string)) return htmlspecialchars($string,ENT_QUOTES,$encoding); foreach($string as $key => $val) $string[$key] = new_html_special_chars($val); return $string; } function new_html_entity_decode($string) { $encoding = 'utf-8'; if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15'; return html_entity_decode($string,ENT_QUOTES,$encoding); } function new_htmlentities($string) { $encoding = 'utf-8'; if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15'; return htmlentities($string,ENT_QUOTES,$encoding); } /** * 安全过滤函数 * * @param $string * @return string */ function safe_replace($string) { $string = str_replace('%20','',$string); $string = str_replace('%27','',$string); $string = str_replace('%2527','',$string); $string = str_replace('*','',$string); $string = str_replace('"','"',$string); $string = str_replace("'",'',$string); $string = str_replace('"','',$string); $string = str_replace(';','',$string); $string = str_replace('<','<',$string); $string = str_replace('>','>',$string); $string = str_replace("{",'',$string); $string = str_replace('}','',$string); $string = str_replace('\\','',$string); return $string; } /** * xss过滤函数 * * @param $string * @return string */ function remove_xss($string) { $string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $string); $parm1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); $parm2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); $parm = array_merge($parm1, $parm2); for ($i = 0; $i < sizeof($parm); $i++) { $pattern = '/'; for ($j = 0; $j < strlen($parm[$i]); $j++) { if ($j > 0) { $pattern .= '('; $pattern .= '(&#[x|X]0([9][a][b]);?)?'; $pattern .= '|(�([9][10][13]);?)?'; $pattern .= ')?'; } $pattern .= $parm[$i][$j]; } $pattern .= '/i'; $string = preg_replace($pattern, ' ', $string); } return $string; } /** * 过滤ASCII码从0-28的控制字符 * @return String */ function trim_unsafe_control_chars($str) { $rule = '/[' . chr ( 1 ) . '-' . chr ( 8 ) . chr ( 11 ) . '-' . chr ( 12 ) . chr ( 14 ) . '-' . chr ( 31 ) . ']*/'; return str_replace ( chr ( 0 ), '', preg_replace ( $rule, '', $str ) ); } /** * 格式化文本域内容 * * @param $string 文本域内容 * @return string */ function trim_textarea($string) { $string = nl2br ( str_replace ( ' ', ' ', $string ) ); return $string; } /** * 将文本格式成适合js输出的字符串 * @param string $string 需要处理的字符串 * @param intval $isjs 是否执行字符串格式化,默认为执行 * @return string 处理后的字符串 */ function format_js($string, $isjs = 1) { $string = addslashes(str_replace(array("\r", "\n", "\t"), array('', '', ''), $string)); return $isjs ? 'document.write("'.$string.'");' : $string; } /** * 转义 javascript 代码标记 * * @param $str * @return mixed */ function trim_script($str) { if(is_array($str)){ foreach ($str as $key => $val){ $str[$key] = trim_script($val); } }else{ $str = preg_replace ( '/\<([\/]?)script([^\>]*?)\>/si', '<\\1script\\2>', $str ); $str = preg_replace ( '/\<([\/]?)iframe([^\>]*?)\>/si', '<\\1iframe\\2>', $str ); $str = preg_replace ( '/\<([\/]?)frame([^\>]*?)\>/si', '<\\1frame\\2>', $str ); $str = str_replace ( 'javascript:', 'javascript:', $str ); } return $str; } /** * 获取当前页面完整URL地址 */ function get_url() { $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; $php_self = $_SERVER['PHP_SELF'] ? safe_replace($_SERVER['PHP_SELF']) : safe_replace($_SERVER['SCRIPT_NAME']); $path_info = isset($_SERVER['PATH_INFO']) ? safe_replace($_SERVER['PATH_INFO']) : ''; $relate_url = isset($_SERVER['REQUEST_URI']) ? safe_replace($_SERVER['REQUEST_URI']) : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.safe_replace($_SERVER['QUERY_STRING']) : $path_info); return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url; } /** * 字符截取 支持UTF8/GBK * @param $string * @param $length * @param $dot */ function str_cut($string, $length, $dot = '...') { $strlen = strlen($string); if($strlen <= $length) return $string; $string = str_replace(array(' ',' ', '&', '"', ''', '“', '”', '—', '<', '>', '·', '…'), array('∵',' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $string); $strcut = ''; if(strtolower(CHARSET) == 'utf-8') { $length = intval($length-strlen($dot)-$length/3); $n = $tn = $noc = 0; while($n < strlen($string)) { $t = ord($string[$n]); if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { $tn = 1; $n++; $noc++; } elseif(194 <= $t && $t <= 223) { $tn = 2; $n += 2; $noc += 2; } elseif(224 <= $t && $t <= 239) { $tn = 3; $n += 3; $noc += 2; } elseif(240 <= $t && $t <= 247) { $tn = 4; $n += 4; $noc += 2; } elseif(248 <= $t && $t <= 251) { $tn = 5; $n += 5; $noc += 2; } elseif($t == 252 || $t == 253) { $tn = 6; $n += 6; $noc += 2; } else { $n++; } if($noc >= $length) { break; } } if($noc > $length) { $n -= $tn; } $strcut = substr($string, 0, $n); $strcut = str_replace(array('∵', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), array(' ', '&', '"', ''', '“', '”', '—', '<', '>', '·', '…'), $strcut); } else { $dotlen = strlen($dot); $maxi = $length - $dotlen - 1; $current_str = ''; $search_arr = array('&',' ', '"', "'", '“', '”', '—', '<', '>', '·', '…','∵'); $replace_arr = array('&',' ', '"', ''', '“', '”', '—', '<', '>', '·', '…',' '); $search_flip = array_flip($search_arr); for ($i = 0; $i < $maxi; $i++) { $current_str = ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i]; if (in_array($current_str, $search_arr)) { $key = $search_flip[$current_str]; $current_str = str_replace($search_arr[$key], $replace_arr[$key], $current_str); } $strcut .= $current_str; } } return $strcut.$dot; } /** * 获取请求ip * * @return ip地址 */ function ip() { 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']; } return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; } function get_cost_time() { $microtime = microtime ( TRUE ); return $microtime - SYS_START_TIME; } /** * 程序执行时间 * * @return int 单位ms */ function execute_time() { $stime = explode ( ' ', SYS_START_TIME ); $etime = explode ( ' ', microtime () ); return number_format ( ($etime [1] + $etime [0] - $stime [1] - $stime [0]), 6 ); } /** * 产生随机字符串 * * @param int $length 输出长度 * @param string $chars 可选的 ,默认为 0123456789 * @return string 字符串 */ function random($length, $chars = '0123456789') { $hash = ''; $max = strlen($chars) - 1; mt_srand(); for($i = 0; $i < $length; $i++) { $hash .= $chars[mt_rand(0, $max)]; } return $hash; } /** * 将字符串转换为数组 * * @param string $data 字符串 * @return array 返回数组格式,如果,data为空,则返回空数组 */ function string2array($data) { $data = trim($data); if($data == '') return array(); if(strpos($data, 'array')===0){ @; }else{ if(strpos($data, '{\\')===0) $data = stripslashes($data); $array=json_decode($data,true); if(strtolower(CHARSET)=='gbk'){ $array = mult_iconv("UTF-8", "GBK//IGNORE", $array); } } return $array; } /** * 将数组转换为字符串 * * @param array $data 数组 * @param bool $isformdata 如果为0,则不使用new_stripslashes处理,可选参数,默认为1 * @return string 返回字符串,如果,data为空,则返回空 */ function array2string($data, $isformdata = 1) { if($data == '' || empty($data)) return ''; if($isformdata) $data = new_stripslashes($data); if(strtolower(CHARSET)=='gbk'){ $data = mult_iconv("GBK", "UTF-8", $data); } if (version_compare(PHP_VERSION,'5.3.0','<')){ return addslashes(json_encode($data)); }else{ return addslashes(json_encode($data,JSON_FORCE_OBJECT)); } } /** * 数组转码 * */ function mult_iconv($in_charset,$out_charset,$data){ if(substr($out_charset,-8)=='//IGNORE'){ $out_charset=substr($out_charset,0,-8); } if(is_array($data)){ foreach($data as $key => $value){ if(is_array($value)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); $rtn[$key]=mult_iconv($in_charset,$out_charset,$value); }elseif(is_string($key) || is_string($value)){ if(is_string($key)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); } if(is_string($value)){ $value=iconv($in_charset,$out_charset.'//IGNORE',$value); } $rtn[$key]=$value; }else{ $rtn[$key]=$value; } } }elseif(is_string($data)){ $rtn=iconv($in_charset,$out_charset.'//IGNORE',$data); }else{ $rtn=$data; } return $rtn; } /** * 转换字节数为其他单位 * * * @param string $filesize 字节大小 * @return string 返回大小 */ function sizecount($filesize) { if ($filesize >= 1073741824) { $filesize = round($filesize / 1073741824 * 100) / 100 .' GB'; } elseif ($filesize >= 1048576) { $filesize = round($filesize / 1048576 * 100) / 100 .' MB'; } elseif($filesize >= 1024) { $filesize = round($filesize / 1024 * 100) / 100 . ' KB'; } else { $filesize = $filesize.' Bytes'; } return $filesize; } /** * 特殊字符转换 * */ function format_html($str){ $str = str_replace('“', '“',$str); $str = str_replace('”', '”',$str); $str = str_replace('·', '·',$str); $str = str_replace('‘', '‘',$str); $str = str_replace('’', '’',$str); $str = str_replace('…', '…', $str); $str = str_replace('—', '—', $str); return $str; } /** * 字符串加密、解密函数 * * * @param string $txt 字符串 * @param string $operation ENCODE为加密,DECODE为解密,可选参数,默认为ENCODE, * @param string $key 密钥:数字、字母、下划线 * @param string $expiry 过期时间 * @return string */ function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0) { $ckey_length = 4; $key = md5($key != '' ? $key : pc_base::load_config('system', 'auth_key')); $keya = md5(substr($key, 0, 16)); $keyb = md5(substr($key, 16, 16)); $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; $cryptkey = $keya.md5($keya.$keyc); $key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? , '-_', '+/')) : 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') { 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 { return $keyc.rtrim(strtr(base64_encode($result), '+/', '-_'), '='); } } /** * 语言文件处理 * * @param string $language 标示符 * @param array $pars 转义的数组,二维数组 ,'key1'=>'value1','key2'=>'value2', * @param string $modules 多个模块之间用半角逗号隔开,如:member,guestbook * @return string 语言字符 */ function L($language = 'no_language',$pars = array(), $modules = '') { static $LANG = array(); static $LANG_MODULES = array(); static $lang = ''; if(defined('IN_ADMIN')) { $lang = SYS_STYLE ? SYS_STYLE : 'zh-cn'; } else { $lang = pc_base::load_config('system','lang'); } if(!$LANG) { require_once PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.'system.lang.php'; if(defined('IN_ADMIN')) require_once PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.'system_menu.lang.php'; if(file_exists(PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.ROUTE_M.'.lang.php')) require_once PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.ROUTE_M.'.lang.php'; } if(!empty($modules)) { $modules = explode(',',$modules); foreach($modules AS $m) { if(!isset($LANG_MODULES[$m])) require_once PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.$m.'.lang.php'; } } if(!array_key_exists($language,$LANG)) { return $language; } else { $language = $LANG[$language]; if($pars) { foreach($pars AS $_k=>$_v) { $language = str_replace('{'.$_k.'}',$_v,$language); } } return $language; } } /** * 模板调用 * * @param $module * @param $template * @param $istag * @return unknown_type */ function template($module = 'content', $template = 'index', $style = '') { if(strpos($module, 'plugin/')!== false) { $plugin = str_replace('plugin/', '', $module); return p_template($plugin, $template,$style); } $module = str_replace('/', DIRECTORY_SEPARATOR, $module); if(!empty($style) && preg_match('/([a-z0-9\-_]+)/is',$style)) { } elseif (empty($style) && !defined('STYLE')) { if(defined('SITEID')) { $siteid = SITEID; } else { $siteid = param::get_cookie('siteid'); } if (!$siteid) $siteid = 1; $sitelist = getcache('sitelist','commons'); if(!empty($siteid)) { $style = $sitelist[$siteid]['default_style']; } } elseif (empty($style) && defined('STYLE')) { $style = STYLE; } else { $style = 'default'; } if(!$style) $style = 'default'; $template_cache = pc_base::load_sys_class('template_cache'); $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php'; if(file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) { if(!file_exists($compiledtplfile) || (@filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > @filemtime($compiledtplfile))) { $template_cache->template_compile($module, $template, $style); } } else { $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php'; if(!file_exists($compiledtplfile) || (file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') && filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > filemtime($compiledtplfile))) { $template_cache->template_compile($module, $template, 'default'); } elseif (!file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) { showmessage('Template does not exist.'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html'); } } return $compiledtplfile; } /** * 输出自定义错误 * * @param $errno 错误号 * @param $errstr 错误描述 * @param $errfile 报错文件地址 * @param $errline 错误行号 * @return string 错误提示 */ function my_error_handler($errno, $errstr, $errfile, $errline) { if($errno==8) return ''; $errfile = str_replace(PHPCMS_PATH,'',$errfile); if(pc_base::load_config('system','errorlog')) { error_log('