<?php
function myEvaluateFormula($formula){
if(empty($formula)) return false;
$formula = preg_replace('/\s+/', '', $formula);
$formula = str_split($formula);
$errors = false;
$foundComma = false;
$numParentesi = 0;
for($i=0; $i<count($formula); $i++){
// Supported chars
if( !is_numeric($formula[$i])
&& $formula[$i] != '+'
&& $formula[$i] != '-'
&& $formula[$i] != '*'
&& $formula[$i] != '/'
&& $formula[$i] != '('
&& $formula[$i] != ')'
&& $formula[$i] != ','
&& $formula[$i] != '^'
&& $formula[$i] != 'a'
&& $formula[$i] != 'c'
&& $formula[$i] != 'e'
&& $formula[$i] != 'g'
&& $formula[$i] != 'i'
&& $formula[$i] != 'l'
&& $formula[$i] != 'r'
&& $formula[$i] != 's'
&& $formula[$i] != 't'
){
$errors = true;
break;
}
// Verify numbers of brackets
if($formula[$i]=='(') $numParentesi++;
if($formula[$i]==')') $numParentesi--;
if($formula[$i]===')'){ // (
if( isset($formula[$i+1])
&& $formula[$i+1]!='+'
&& $formula[$i+1]!='-'
&& $formula[$i+1]!='*'
&& $formula[$i+1]!='/'
&& $formula[$i+1]!=')'
&& $formula[$i+1]!='^'
){
$errors = true;
break;
}
continue;
}
if(is_numeric($formula[$i]) // Numbers
){
if( isset($formula[$i+1])
&& $formula[$i+1]!='+'
&& $formula[$i+1]!='-'
&& $formula[$i+1]!='*'
&& $formula[$i+1]!='/'
&& $formula[$i+1]!=')'
&& $formula[$i+1]!='^'
&& $formula[$i+1]!=','
&& !is_numeric($formula[$i+1])
){
$errors = true;
break;
}
continue;
}
if( $formula[$i]=='(' // '('
|| $formula[$i]=='+' // '+'
|| $formula[$i]=='*' // '*'
|| $formula[$i]=='/' // '/'
|| $formula[$i]=='^' // '^'
){
$foundComma = false;
if( (
isset($formula[$i+1]) && (
$formula[$i+1]=='+' // a++b not allowed
// || $formula[$i+1]=='-' // a+-b allowed
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==','
|| $formula[$i+1]==')'
)
)
|| ($i+1 == count($formula))
){
$errors = true;
break;
}
if($formula[$i]=='+' && isset($formula[$i+1]) && isset($formula[$i+2]) && $formula[$i+1] =='-' && $formula[$i+2] =='+'){ // a+-+b not allowed
$errors = true;
break;
}
continue;
}
if( $formula[$i]=='-' // '-'
){
$foundComma = false;
if( (
isset($formula[$i+1]) && (
// $formula[$i+1]=='+' || // a-+b allowed
$formula[$i+1]=='-' // a--b not allowed
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==','
|| $formula[$i+1]==')'
)
)
|| ($i+1 == count($formula))
){
$errors = true;
break;
}
if(isset($formula[$i+1]) && isset($formula[$i+2]) && $formula[$i+1] =='+' && $formula[$i+2] =='-'){ // a-+-b not allowed
$errors = true;
break;
}
continue;
}
if( $formula[$i]==',' // ','
){
if($foundComma){ // if i matched a comma
$errors = true;
break;
}
$foundComma = true;
if( isset($formula[$i+1]) && !(
is_numeric($formula[$i+1])
)
){
$errors = true;
break;
}
continue;
}
// MATH FUNCTIONS
// abs, atan
if( $formula[$i] == 'a'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'b' && $formula[$i+2] == 's' && $formula[$i+3] == '(')
|| (isset($formula[$i+4]) && ($formula[$i+1] == 't' && $formula[$i+2] == 'a' && $formula[$i+3] == 'n' && $formula[$i+4] == '('))
)
){
$errors = true;
break;
} else {
$numParentesi++;
if($formula[$i+1] == 'b' && $formula[$i+2] == 's' && $formula[$i+3] == '(') $i = $i+3;
else $i = $i+4;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// ceil, cot, cos
if( $formula[$i] == 'c'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'o' && $formula[$i+2] == 't' && $formula[$i+3] == '(')
|| ($formula[$i+1] == 'o' && $formula[$i+2] == 's' && $formula[$i+3] == '(')
|| (isset($formula[$i+4]) && ($formula[$i+1] == 'e' && $formula[$i+2] == 'i' && $formula[$i+3] == 'l' && $formula[$i+4] == '('))
)
){
$errors = true;
break;
} else {
$numParentesi++;
if(
$formula[$i+1] == 'o' && $formula[$i+2] == 't' && $formula[$i+3] == '('
|| $formula[$i+1] == 'o' && $formula[$i+2] == 's' && $formula[$i+3] == '('
) $i = $i+3;
else $i = $i+4;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// exp
if( $formula[$i] == 'e'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'x' && $formula[$i+2] == 'p' && $formula[$i+3] == '(')
)
){
$errors = true;
break;
} else {
$numParentesi++;
$i = $i+3;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// gmp_fact
if( $formula[$i] == 'g'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3]) || !isset($formula[$i+4]) || !isset($formula[$i+5]) || !isset($formula[$i+6]) || !isset($formula[$i+7]) || !isset($formula[$i+8])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'm' && $formula[$i+2] == 'p' && $formula[$i+3] == '_' && $formula[$i+4] == 'f' && $formula[$i+5] == 'a' && $formula[$i+6] == 'c' && $formula[$i+7] == 't' && $formula[$i+8] == '(')
)
){
$errors = true;
break;
} else {
$numParentesi++;
$i = $i+8;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// intval
if( $formula[$i] == 'i'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3]) || !isset($formula[$i+4]) || !isset($formula[$i+5]) || !isset($formula[$i+6])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'n' && $formula[$i+2] == 't' && $formula[$i+3] == 'v' && $formula[$i+4] == 'a' && $formula[$i+5] == 'l' && $formula[$i+6] == '(')
)
){
$errors = true;
break;
} else {
$numParentesi++;
$i = $i+6;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// sin, sqrt
if( $formula[$i] == 's'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'i' && $formula[$i+2] == 'n' && $formula[$i+3] == '(')
|| (isset($formula[$i+4]) && ($formula[$i+1] == 'q' && $formula[$i+2] == 'r' && $formula[$i+3] == 't' && $formula[$i+4] == '('))
)
){
$errors = true;
break;
} else {
$numParentesi++;
if($formula[$i+1] == 'i' && $formula[$i+2] == 'n' && $formula[$i+3] == '(') $i = $i+3;
else $i = $i+4;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// tan
if( $formula[$i] == 't'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'a' && $formula[$i+2] == 'n' && $formula[$i+3] == '(')
)
){
$errors = true;
break;
} else {
$numParentesi++;
$i = $i+3;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// log, log10
if( $formula[$i] == 'l'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'o' && $formula[$i+2] == 'g' && $formula[$i+3] == '(')
|| (isset($formula[$i+4]) && isset($formula[$i+5]) && ($formula[$i+1] == 'o' && $formula[$i+2] == 'g' && $formula[$i+3] == '1' && $formula[$i+4] == '0' && $formula[$i+5] == '('))
)
){
$errors = true;
break;
} else {
$numParentesi++;
if($formula[$i+1] == 'o' && $formula[$i+2] == 'g' && $formula[$i+3] == '(') $i = $i+3;
else $i = $i+5;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
// rand, round
if( $formula[$i] == 'r'){
if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3]) || !isset($formula[$i+4])){
$errors = true;
break;
} else {
if( !(
($formula[$i+1] == 'a' && $formula[$i+2] == 'n' && $formula[$i+3] == 'd' && $formula[$i+4] == '(')
|| (isset($formula[$i+5]) && ($formula[$i+1] == 'o' && $formula[$i+2] == 'u' && $formula[$i+3] == 'n' && $formula[$i+4] == 'd' && $formula[$i+5] == '('))
)
){
$errors = true;
break;
} else {
$numParentesi++;
if($formula[$i+1] == 'a' && $formula[$i+2] == 'n' && $formula[$i+3] == 'd' && $formula[$i+4] == '(') $i = $i+4;
else $i = $i+5;
if( !isset($formula[$i+1]) || (
isset($formula[$i+1]) && (
$formula[$i+1]=='+'
|| $formula[$i+1]=='*'
|| $formula[$i+1]=='/'
|| $formula[$i+1]=='^'
|| $formula[$i+1]==')'
|| $formula[$i+1]==','
)
)
){
$errors = true;
break;
}
}
}
continue;
}
}
if($numParentesi!=0){
$errors = true;
}
return !$errors;
}
?>