377 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			377 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| 	// utils.php
 | |
| 	// library of misc utilities
 | |
| 	
 | |
| 	
 | |
| 	// function subkey sort
 | |
| 	// function prototype :
 | |
| 	// array utils_sksort(array $arr, string $key, int $flag=SORT_ASC)
 | |
| 	// sorts an array of associative arrays by given key $key
 | |
| 	// $flag can be SORT_ASC or SORT_DESC for ascending
 | |
| 	// or descending order (defaults to ascending);
 | |
| 	// other flags are the same of array_multisort() php function ;)
 | |
| 	function utils_sksort($arr, $key, $flag=SORT_ASC) {
 | |
| 		if ($arr) {
 | |
| 			foreach($arr as $val)
 | |
| 				$sorter[] = $val[$key];
 | |
| 			array_multisort($sorter, $flag, $arr);
 | |
| 			return $arr;
 | |
| 		} else return false;
 | |
| 	}
 | |
| 	
 | |
| 	// function prototype:
 | |
| 	// bool utils_pattern_match(string $string, string $pattern)
 | |
| 	
 | |
| 	// returns true if $pattern matches $string, else returns false (what else?)
 | |
| 	// $pattern is a string containing standard shell-style jokers: * and ?
 | |
| 	// regex are powerful but somtimes, too complicated :)
 | |
| 	// usage: 	* matches a variable number of chars
 | |
| 	//			e.g. : doc*.txt   matches  document.txt, docs.txt, dock.txt, etc.
 | |
| 	//					and also doc.txt (note: I didn't want it to do that, but I didn't change it)
 | |
| 	//		? matches one char, whichever is
 | |
| 	//			e.g. : document?.txt matches document1.txt, document2.txt, document3.txt, etc.
 | |
| 	//					likewise "*", it should match document.txt, too (but I hadn't tried it :) )
 | |
| 	
 | |
| 	// code from http://www.php.net/function.glob.php.htm#54519
 | |
| 	// by x_terminat_or_3 at yahoo dot country:fr
 | |
| 	// thank you, man ;)
 | |
| 	// as usual, slightly modified to fit my tastes :)
 | |
| 	
 | |
| if (!function_exists('fnmatch')) {
 | |
| 	function fnmatch($pattern, $string) {
 | |
| 		
 | |
| 		if ($pattern == null)
 | |
| 			return false;
 | |
| 		
 | |
| 		//basically prepare a regular expression
 | |
| 		$out=null;
 | |
| 		$chunks=explode(';',$pattern);
 | |
| 		foreach($chunks as $pattern)
 | |
| 		{
 | |
| 			$escape=array('$','^','.','{','}','(',')','[',']','|');
 | |
| 			while(strpos($pattern,'**')!==false)
 | |
| 				$pattern=str_replace('**','*',$pattern);
 | |
| 				
 | |
| 			foreach($escape as $probe)
 | |
| 				$pattern=str_replace($probe,"\\$probe",$pattern);
 | |
| 			$pattern=str_replace('?*','*', str_replace('*?','*', 
 | |
| 										str_replace('*',".*",
 | |
| 												str_replace('?','.{1,1}',$pattern))));
 | |
| 			$out[]=$pattern;
 | |
| 		}
 | |
| 		/* // NoWhereMan note: why splitting this in two? :)
 | |
| 				if(count($out)==1) return(eregi("^$out[0]$",$string)); else*/
 | |
| 		foreach($out as $tester) {
 | |
| 			if (eregi("^$tester$",$string))
 | |
| 				return true;
 | |
| 		}
 | |
| 				
 | |
| 		return false;
 | |
| 	}
 | |
| }
 | |
| 	
 | |
| 	
 | |
| 	// function prototype:
 | |
| 	// array utils_kexplode(string $string, string $delim='|')
 | |
| 	
 | |
| 	// explodes a string into an array by the given delimiter;
 | |
| 	// delimiter defaults to pipe ('|').
 | |
| 	// the string must be formatted as in:
 | |
| 	//	key1|value1|key2|value2 , etc.
 | |
| 	// the array will look like
 | |
| 	// $arr['key1'] = 'value1'; $arr['key2'] = 'value2'; etc.
 | |
| 	
 | |
| 	function utils_kexplode($string, $delim='|', $keyupper=true) {
 | |
| 		$arr = array();
 | |
| 		$string = trim($string);
 | |
| 		
 | |
| 		$k = strtolower(strtok($string, $delim));	
 | |
| 		$arr[$k] = strtok($delim);
 | |
| 		while (( $k = strtok($delim) ) !== false) {
 | |
| 			if ($keyupper && !preg_match('/[A-Z-_]/',$k)){
 | |
| 				/* 
 | |
| 				trigger_error("Failed parsing <pre>$string</pre>
 | |
| 				keys were supposed to be UPPERCASE but <strong>\"$k\"</strong> was found; file may be corrupted
 | |
| 				or in an expected format. <br /> 
 | |
| 				Some SimplePHPBlog files may raise this error: set DUMB_MODE_ENABLED 
 | |
| 				to true in your defaults.php to force parsing of the offending keys.", 
 | |
| 				E_USER_WARNING);
 | |
| 				*/
 | |
| 				continue;
 | |
| 			}
 | |
| 			
 | |
| 			$arr[strtolower($k)] = strtok($delim);
 | |
| 		}
 | |
| 		
 | |
| 		return $arr;
 | |
| 	}
 | |
| 	
 | |
| 
 | |
| 	/*
 | |
| 	function utils_newkexplode($string, $delim='|') {
 | |
| 	
 | |
| 		$arr = array();
 | |
| 		
 | |
| 		$lastoffset = $offset = 0;
 | |
| 		$len = strlen($string);
 | |
| 		
 | |
| 		while ($lastoffset<$len) {
 | |
| 			$offset = strpos($string, $delim, $lastoffset);
 | |
| 			$key = substr($string, $lastoffset, $offset-$lastoffset);
 | |
| 			//echo 'parsing key: ', $key, $offset, chr(10);
 | |
| 			
 | |
| 			$lastoffset = $offset + 1;
 | |
| 			
 | |
| 			if (!ctype_upper($key)) 
 | |
| 				trigger_error("Failed parsing \"$string\"
 | |
| 				keys were supposed to be UPPERCASE", E_USER_ERROR);
 | |
| 			
 | |
| 			$offset = strpos($string, $delim, $lastoffset);
 | |
| 
 | |
| 			if ($offset===false)
 | |
| 				$offset = $len;
 | |
| 
 | |
| 			$val = substr($string, $lastoffset, $offset-$lastoffset);
 | |
| 
 | |
| 			//echo 'parsing value ', $val, $offset, chr(10);
 | |
| 			
 | |
| 			$lastoffset = $offset + 1;
 | |
| 			
 | |
| 			$arr[$key] = $val;
 | |
| 		
 | |
| 		}	
 | |
| 		return $arr;
 | |
| 		
 | |
| 	}*/
 | |
| 
 | |
| 	
 | |
| 	// function prototype:
 | |
| 	// array utils_kimplode(string $string, string $delim='|')
 | |
| 	
 | |
| 	// explodes a string into an array by the given delimiter; 
 | |
| 	// delimiter defaults to pipe ('|').
 | |
| 	// the string must be formatted as in:
 | |
| 	//	key1|value1|key2|value2 , etc.
 | |
| 	// the array will look like
 | |
| 	// $arr['key1'] = 'value1'; $arr['key2'] = 'value2'; etc.
 | |
| 	
 | |
| 	function utils_kimplode($arr, $delim='|') {
 | |
| 		
 | |
| 		$string = "";
 | |
| 		foreach ($arr as $k => $val) {
 | |
| 			if ($val)
 | |
| 				$string .= strtoupper($k) . $delim . ($val) . $delim;
 | |
| 		}
 | |
| 		return $string;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * @todo send mail to admin
 | |
| 	 */
 | |
| 
 | |
| 
 | |
| 	function &utils_explode_recursive($array, &$string, $rdelim, $ldelim='', $outerldelim='', $outerrdelim='') {
 | |
| 
 | |
| 		$string .= $outerldelim;
 | |
| 
 | |
| 		while (list(,$val) = each($array)) {
 | |
| 			
 | |
| 			$string .= $rdelim;
 | |
| 			if (is_array($val)) {
 | |
| 				$string .= utils_explode_recursive($val, $string, $rdelim, $ldelim, $outerldelim, $outerrdelim);
 | |
| 			} else {
 | |
| 				$string .= $val;	
 | |
| 			}
 | |
| 
 | |
| 			$string .= $ldelim;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		$string .= $outerrdelim;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 	function utils_validateinput($str) {
 | |
| 		
 | |
| 		if (preg_match('/[^a-z0-9\-_]/i',$str)){
 | |
| 			trigger_error("String \"$str\" is not a valid input", E_USER_ERROR);
 | |
| 			//return false;
 | |
| 		} else
 | |
| 			return true;
 | |
| 	}
 | |
| 	
 | |
| 	function utils_cut_string($str,$maxc) {
 | |
| 		$car = strlen($str);
 | |
| 		if($car > $maxc) {
 | |
| 			return substr($str, 0, $maxc)."...";
 | |
| 		} else {
 | |
| 			return $str;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	function utils_status_header($status) {
 | |
| 
 | |
| 		switch ($status) {
 | |
| 			case 301:
 | |
| 				header("HTTP/1.1 301 Moved Permanently");
 | |
| 				break;
 | |
| 			case 403:
 | |
| 				header("HTTP/1.1 403 Forbidden");
 | |
| 				break;
 | |
| 			case 404:
 | |
| 				header("HTTP/1.1 404 Not Found");
 | |
| 				break;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	// code from php.net ;)
 | |
| 	// defaults to index.php ;)
 | |
| 	function utils_redirect($location="", $absolute_path=false, $red_type=null) {
 | |
| 
 | |
| 		if (!$absolute_path)
 | |
| 			$location = BLOG_BASEURL . $location;
 | |
| 		
 | |
| 		if ( function_exists('wp_redirect') ) {
 | |
| 			wp_redirect($location);
 | |
| 		} else {
 | |
| 			header("Location: $location");
 | |
| 		}
 | |
| 		
 | |
| 		exit();
 | |
| 
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/*
 | |
| 	 * utils_geturlstring()
 | |
| 	 * 
 | |
| 	 * @return string complete url string as displayed in the browser
 | |
| 	 * 
 | |
| 	 */
 | |
| 	 
 | |
| 	function utils_geturlstring() {
 | |
| 		$str = BLOG_BASEURL . $_SERVER['PHP_SELF'];
 | |
| 		if ($_SERVER['QUERY_STRING'])
 | |
| 			$str .='?'.$_SERVER['QUERY_STRING'];
 | |
| 		return $str; 
 | |
| 	}
 | |
| 	
 | |
| 	// custom array_merge:
 | |
| 	// pads the second array to match the length of the first
 | |
| 	// this can be improved, anyway for now I'd just
 | |
| 	// do a quick & dirty solution :)
 | |
| 	function utils_array_merge($arr1, $arr2) {
 | |
| 		
 | |
| 		$len=count($arr1[0]);
 | |
| 		
 | |
| 		foreach($arr2 as $k=>$v)
 | |
| 			$arr2[$k]=array_pad((Array) $v, $len, null);
 | |
| 		
 | |
| 		return array_merge($arr1, $arr2);
 | |
| 	}
 | |
| 
 | |
| 		
 | |
| 	/*
 | |
| 	* Simple function to replicate PHP 5 behaviour
 | |
| 	*/
 | |
| 	function utils_microtime()
 | |
| 	{
 | |
| 		list($usec, $sec) = explode(" ", microtime());
 | |
| 		return ((float)$usec + (float)$sec);
 | |
| 	}
 | |
| 
 | |
| 	function utils_countdashes($string, &$rest) {
 | |
| 		trim($string);
 | |
| 		$i = 0;
 | |
| 		while ($string{$i} == '-') {
 | |
| 			$i++;
 | |
| 		}
 | |
| 		if ($i)
 | |
| 			$rest = substr($string, $i);
 | |
| 		else $rest = $string;
 | |
| 
 | |
| 		return $i;
 | |
| 
 | |
| 
 | |
| 	}
 | |
| 	
 | |
| 	function utils_mail($from, $subject, $message, $headers = '') {
 | |
| 		global $fp_config;
 | |
| 		if( $headers == '' ) {
 | |
| 			$headers = "MIME-Version: 1.0\n" .
 | |
| 				"From: " . $from . "\n" . 
 | |
| 				"Content-Type: text/plain; charset=\"" . $fp_config['general']['charset'] . "\"\n";
 | |
| 		}
 | |
| 	
 | |
| 		return mail($fp_config['general']['email'], $subject, $message, $headers);
 | |
| 	}
 | |
| 	
 | |
| 	// get client IP
 | |
| 	function utils_ipget() {
 | |
| 		
 | |
| 		$ip = '';
 | |
| 
 | |
| 		if ( !empty ( $_SERVER[ 'HTTP_CLIENT_IP' ] ) ) {
 | |
| 			$ip = $_SERVER[ 'HTTP_CLIENT_IP' ];
 | |
| 		}
 | |
| 		elseif ( !empty ( $_SERVER[ 'HTTP_X_FORWARDED_FOR' ] ) ) {
 | |
| 			$ip = $_SERVER[ 'HTTP_X_FORWARDED_FOR' ];
 | |
| 		}
 | |
| 		elseif ( !empty ( $_SERVER[ 'REMOTE_ADDR' ] ) ) {
 | |
| 			$ip = $_SERVER[ 'REMOTE_ADDR' ];
 | |
| 		}
 | |
| 		elseif ( getenv( "HTTP_CLIENT_IP" ) ) {
 | |
| 			$ip = getenv( "HTTP_CLIENT_IP" );
 | |
| 		}
 | |
| 		elseif ( getenv( "HTTP_X_FORWARDED_FOR" ) ) {
 | |
| 			$ip = getenv( "HTTP_X_FORWARDED_FOR" );
 | |
| 		}
 | |
| 		elseif ( getenv( "REMOTE_ADDR") ) {
 | |
| 			$ip = getenv( "REMOTE_ADDR" );
 | |
| 		}
 | |
| 
 | |
| 		if (preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $ip)) {
 | |
| 			return $ip;
 | |
| 		} else {
 | |
| 			return '';
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	function utils_nocache_headers() {
 | |
| 	        @ header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
 | |
| 	        @ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
 | |
| 	        @ header('Cache-Control: no-cache, must-revalidate, max-age=0');
 | |
| 	        @ header('Pragma: no-cache');
 | |
| 	}
 | |
| 
 | |
| 	
 | |
| 	function utils_checksmarty() {
 | |
| 	
 | |
| 		if (!file_exists(SMARTY_DIR . 'Smarty.class.php')) {
 | |
| 		$err = <<<ERR
 | |
| 		Fatal error: Smarty is not installed; please download it from <a href="http://smarty.php.net">http://smarty.php.net</a>; you will 
 | |
| 	probably need <a href="http://www.phpinsider.com/php/code/SmartyValidate/">SmartyValidate</a> as well; unpack them to <b>fp-includes/core/smarty</b>: please do not overwrite files in fp-includes/core/smarty/plugins/
 | |
| ERR;
 | |
| 		trigger_error($err, E_USER_ERROR);
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	function fplog($str) {
 | |
| 		if(!defined('DEBUG_MODE'))
 | |
| 			echo "\n[DEBUG] $str \n";
 | |
| 	}
 | |
| 	
 | |
| ?>
 | 
