X Tutup
$zone)){ return $config->$zone; }elseif(isset($config->default)){ return $config->default; } return null; } return $config; } public static function parse($configFile){ self::$_tmpPrefix = 0; self::$_tmpData=array(); $cacheKey = "SConfig_Cache_".md5(realpath($configFile)); if(self::$CACHE){ if(isset(self::$_result[$cacheKey])){ return self::$_result[$cacheKey]; } $tmp_file = self::_tmpDir()."/".self::$_tmpPrefix.$cacheKey; if(is_file($tmp_file) && filemtime($tmp_file)>=filemtime($configFile)){ $result = unserialize(file_get_contents($tmp_file,false)); self::$_result[$cacheKey]=$result; return $result; } } $content = file_get_contents($configFile,false); //去掉注释,#号表示注释 $content = preg_replace("/^(\s*)#(.*)/m","",$content); //保存临时变量,单引号,双引号里特殊字符 $content = preg_replace_callback("/(\S+?)[\s:]+([\'\"])(.*?)\\2;/m",array("SConfig","_tmpData"),$content); //获取最直接的k,v值 $result = self::_getKV($content); self::_split($content,$result); if(self::$CACHE){ file_put_contents($tmp_file,serialize($result),LOCK_EX); self::$_result[$cacheKey]=$result; } return $result; } private static $_tmpData=array(); private static $_tmpPrefix="SCONFIG_TMP_PREFIX_"; private static $_tmpIndex=0; private static $_result=array(); private static function _tmpData($matches){ $key = self::$_tmpPrefix.(self::$_tmpIndex++); self::$_tmpData[$key]=$matches[3]; return $matches[1].":".$key.";"; } private static function _getKV($string) { $_data = new stdclass; $tmp_string = preg_replace("/([\w\.\-\_]+?)([\s:]*)\{(([^{}]+|(?R))+)\}/","",$string); preg_match_all("/([\w\.\-\_]+)[\s:]+(.+?);/",$tmp_string,$_matches2,PREG_SET_ORDER); if(!empty($_matches2)){ foreach($_matches2 as $_m2){ $key = $_m2[1]; $value= $_m2[2]; if(isset(self::$_tmpData[$value])){$value = self::$_tmpData[$value];} //类型转化 if(is_numeric($value)){ $value = $value+0;//自动转化 }elseif(is_string($value)){ $v_t = strtolower($value);; if($v_t == "true" ) $value =true; elseif($v_t == "false" )$value=false; } if(isset($_data->$key)){ if(is_array($_data->$key)){ array_push($_data->$key,$value); }else{ $tmp2=array($_data->$key,$value); $_data->$key = $tmp2; } }else{ $_data->$key = $value; } } } return $_data; } private static function _split ($string,&$result) { preg_match_all("/([\w\.\-\_]*?)[:\s]*\{(([^{}]*|(?R))+)\}/xms",$string,$matches,PREG_SET_ORDER); if (!empty($matches)) { foreach($matches as $m){ if(empty($m[1]))continue; $_data = self::_getKV($m[2]); if(!isset($result->{$m[1]})){ if(!is_array($result)){ $result->{$m[1]} = $_data; } }else{ if(is_array($result->{$m[1]})){ array_push($result->{$m[1]},$_data); }else{ $result->{$m[1]} = array($result->{$m[1]},$_data); } } self::_split($m[2], $_data); } } } private static function _tmpDir(){ if ( !function_exists('sys_get_temp_dir')){ function sys_get_temp_dir() { if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); } if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); } if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); } $tempfile=tempnam(uniqid(rand(),TRUE),''); if (is_file($tempfile)) { unlink($tempfile); return realpath(dirname($tempfile)); } } } return sys_get_temp_dir(); } }
X Tutup