Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?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;
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement