Hay un montón de bibliotecas de evaluación de matemáticas para PHP. Una búsqueda rápida en la web aparece this one.
Escribir su propio programa de análisis es también una opción, y si es sólo aritmética básica no debería ser demasiado difícil. Con los recursos que hay, me mantendría alejado de esto.
Puede tener un enfoque más simple y usar eval. Tenga cuidado de desinfectar su entrada primero. En el eval docs's page, hay comentarios con código para hacer eso. Aquí hay un ejemplo:
Descargo de responsabilidad: Sé que eval es solo una falta de ortografía del mal, y es algo horrible y horrible, y todo eso. Si se usa correctamente, tiene usos, sin embargo.
<?php
$test = '2+3*pi';
// Remove whitespaces
$test = preg_replace('/\s+/', '', $test);
$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functions = '(?:sinh?|cosh?|tanh?|abs|acosh?|asinh?|atanh?|exp|log10|deg2rad|rad2deg|sqrt|ceil|floor|round)'; // Allowed PHP functions
$operators = '[+\/*\^%-]'; // Allowed math operators
$regexp = '/^(('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?2))?)+$/'; // Final regexp, heavily using recursive patterns
if (preg_match($regexp, $q))
{
$test = preg_replace('!pi|π!', 'pi()', $test); // Replace pi with pi function
eval('$result = '.$test.';');
}
else
{
$result = false;
}
?>
preg_match_all + eval + str_replace (o con preg_replace_callback) ... en ese orden. pero ten cuidado, la evaluación puede ser peligrosa, no coincida con [] o alguien podría agregar código en []. – Rufinus
Puede 'eval()' las declaraciones, eso es un riesgo de seguridad. – Robus