Por fin después de mucho luchar ya dimos con la contestación de este atascamiento que agunos lectores de nuestra web han presentado. Si deseas aportar algo no dudes en aportar tu comentario.
Solución:
Si bien no sugiero usar eval
por esto (es no la solución), el problema es que eval
espera líneas completas de código, no solo fragmentos.
$ma ="2+10";
$p = eval('return '.$ma.';');
print $p;
Deberías hacer lo que quieras.
Una mejor solución sería escribir un tokenizador/analizador para su expresión matemática. Aquí hay uno muy simple basado en expresiones regulares para darle un ejemplo:
$ma = "2+10";
if(preg_match('/(d+)(?:s*)([+-*/])(?:s*)(d+)/', $ma, $matches) !== FALSE)
$operator = $matches[2];
switch($operator)
case '+':
$p = $matches[1] + $matches[3];
break;
case '-':
$p = $matches[1] - $matches[3];
break;
case '*':
$p = $matches[1] * $matches[3];
break;
case '/':
$p = $matches[1] / $matches[3];
break;
echo $p;
Mira esto..
Lo uso en un sistema de contabilidad donde puede escribir expresiones matemáticas en campos de entrada de cantidad.
Ejemplos
$Cal = new Field_calculate();
$result = $Cal->calculate('5+7'); // 12
$result = $Cal->calculate('(5+9)*5'); // 70
$result = $Cal->calculate('(10.2+0.5*(2-0.4))*2+(2.1*4)'); // 30.4
Código
class Field_calculate
const PATTERN = '/(?:-?d+(?:.?d+)?[+-*/])+-?d+(?:.?d+)?/';
const PARENTHESIS_DEPTH = 10;
public function calculate($input) strpos($input, '-') != null
private function compute($input)
$compute = create_function('', 'return '.$input.';');
return 0 + $compute();
private function callback($input)
if(is_numeric($input[1]))
return $input[1];
elseif(preg_match(self::PATTERN, $input[1], $match))
return $this->compute($match[0]);
return 0;
Usar la función eval es muy peligroso cuando no puedes controlar el string argumento.
Pruebe Matex para el cálculo seguro de fórmulas matemáticas.
Más adelante puedes encontrar las acotaciones de otros usuarios, tú aún tienes la habilidad dejar el tuyo si lo deseas.