return $array;
}
+
+/**
+ * Safe equivalent of eval() that parses a statement of the form
+ * $varname = array( 'constant' => 'constant', ... ); or
+ * $varname = 'constant'; or
+ * $varname = 123;
+ * and refuses to execute anything.
+ *
+ * @return True on success ($varname set globally), false on failue
+ */
+function wfParsePHP( $php ) {
+ $tokens = token_get_all( "<?php $php" );
+ array_shift( $tokens ); // Discard <?php token
+ $token = array_shift( $tokens ); // $varname token
+ if ( @$token[0] == T_WHITESPACE )
+ $varToken = array_shift( $tokens ); // discard whitespace
+ if ( @$token[0] != T_VARIABLE )
+ return false;
+ $varname = substr( $token[1], 1 ); // discard leading $
+
+ $token = array_shift( $tokens );
+ if ( @$token[0] == T_WHITESPACE )
+ $token = array_shift( $tokens ); // discard whitespace
+ if ( $token[0] != '=' )
+ return false;
+
+ $isGood = true;
+ $varvalue = wfParsePHP_recursive( $tokens, $isGood );
+ if ( $isGood )
+ $GLOBALS[$varname] = $varvalue;
+ return $isGood;
+}
+
+function wfParsePHP_recursive( &$tokens, &$isGood ) {
+ $isGood = true;
+ $varvalue = null;
+ $token = array_shift( $tokens );
+ if ( @$token[0] == T_WHITESPACE )
+ $token = array_shift( $tokens ); // discard whitespace
+ if ( @$token[0] == T_ARRAY )
+ $vartype = 'array';
+ else if ( @$token[0] == T_CONSTANT_ENCAPSED_STRING )
+ $vartype = 'string';
+ else if ( @$token[0] == T_LNUMBER )
+ $vartype = 'integer';
+ else if ( @$token[0] == T_DNUMBER )
+ $vartype = 'float';
+ else if ( @$token[0] == T_STRING )
+ $vartype = 'other';
+ else
+ return $isGood = false;
+
+ switch ( $vartype ) {
+ case 'string':
+ $varvalue = stripslashes( substr( $token[1], 1, -1 ) );
+ break;
+ case 'integer':
+ $base = 10;
+ if ( $token[1][0] == '0' ) {
+ if ( $token[1][1] == 'x' )
+ $base = 16;
+ else
+ $base = 8;
+ }
+ $varvalue = intval( $token[1], $base );
+ break;
+ case 'float':
+ $varvalue = (float)$token[1];
+ break;
+ case 'other':
+ if ( strcasecmp( $token[1], 'true' ) == 0 )
+ $varvalue = true;
+ else if ( strcasecmp( $token[1], 'false' ) == 0 )
+ $varvalue = false;
+ else if ( strcasecmp( $token[1], 'null' ) == 0 )
+ $varvalue = null;
+ else
+ return $isGood = false;
+ break;
+ case 'array':
+ $varvalue = array();
+ $token = array_shift( $tokens );
+ if ( @$token[0] == T_WHITESPACE )
+ $token = array_shift( $tokens ); // discard whitespace
+ if ( @$token != '(' )
+ return $isGood = false;
+
+ $first = true;
+ while( true ) {
+ $token = array_shift( $tokens );
+ //if(!$first) { var_dump($token);var_dump($tokens);die(); }
+ if ( @$token[0] == T_WHITESPACE )
+ $token = array_shift( $tokens ); // discard whitespace
+ array_unshift( $tokens, $token );
+ //if(!$first) { var_dump($token);var_dump($tokens);die(); }
+ $recGood = true;
+ $key = null;
+ $val = wfParsePHP_recursive( $tokens, $recGood );
+ if ( !$recGood )
+ return $isGood = false;
+ //var_dump($key);var_dump($tokens);die();
+ $token = array_shift( $tokens );
+ if ( @$token[0] == T_WHITESPACE )
+ $token = array_shift( $tokens ); // discard whitespace
+ if ( @$token[0] == T_DOUBLE_ARROW ) {
+ $key = $val;
+ //die("2");
+ $token = array_shift( $tokens ); // discard =>
+ if ( @$token[0] == T_WHITESPACE )
+ $token = array_shift( $tokens );
+ //die("3");
+ array_unshift( $tokens, $token );
+ //var_dump($tokens);die();
+ $val = wfParsePHP_recursive( $tokens, $recGood );
+ //var_dump($val);var_dump($tokens);die();
+ if ( !$recGood )
+ return $isGood = false;
+ $token = array_shift( $tokens );
+ }
+
+ if ( is_null( $key ) )
+ $varvalue[] = $val;
+ else
+ $varvalue[$key] = $val;
+
+ if ( @$token[0] == T_WHITESPACE )
+ $token = array_shift( $tokens ); // discard whitespace
+ //var_dump($token);var_dump($tokens);die();
+ if ( $token == ')' )
+ break;
+ else if ( $token != ',' )
+ return $isGood = false;
+ $first = false;
+ }
+ break;
+ default:
+ return $isGood = false;
+ }
+ return $varvalue;
+}