L'opzione più sicura e facile da mantenere sarà la programmazione di un "mini-linguaggio" dedicato in php. Puoi renderlo un sottoinsieme di php o renderlo simile alle formule di Excel o persino inventare il tuo. In questo modo avrai sempre il pieno controllo di ciò che sta accadendo.
//
solo per divertimento, ecco una piccola Lisp per voi
function lisp($x) {
if(is_string($x)) {
$re = '~\(([^()]*)\)~';
while(preg_match($re, $x))
$x = preg_replace_callback($re, 'lisp', $x);
return trim($x);
}
$x = preg_split('~\s+~', $x[1]);
$e = array_shift($x);
if(!$x)
return is_numeric($e) ? floatval($e) : $e;
switch($e) {
case '+': return lisp($x[0]) + lisp($x[1]);
case '-': return lisp($x[0]) - lisp($x[1]);
case '*': return lisp($x[0]) * lisp($x[1]);
case '/': return lisp($x[0])/lisp($x[1]);
case 'concat': return lisp($x[0]) . lisp($x[1]);
}
return function_exists($e) ?
call_user_func_array($e, array_map('lisp', $x)) : '';
}
$input = '
(strtolower
(concat
(strrev olleh)
(+ 22 20)))';
echo lisp($input); // hello42
;))
@stereofrog Ecco perché non sto consigliarlo. Sentiti libero di modificare la mia risposta per renderla meno confusa. Sono terribile alle spiegazioni. – NullUserException
Non dovrebbe essere "Funzione affidabile ** whitelisting ** è impossibile in PHP"? Perché la lista nera è possibile usando disable_functions. – wimvds
Non l'ho notato, lo modifico quindi: p. – wimvds