Advertisement
Guest User

Daniele Mams

a guest
Mar 21st, 2014
1,189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 11.63 KB | None | 0 0
  1. <?php
  2.  
  3. function myEvaluateFormula($formula){
  4.     if(empty($formula)) return false;
  5.    
  6.     $formula = preg_replace('/\s+/', '', $formula);
  7.  
  8.     $formula = str_split($formula);
  9.     $errors = false;
  10.     $foundComma = false;
  11.     $numParentesi = 0;
  12.     for($i=0; $i<count($formula); $i++){
  13.  
  14.         // Supported chars
  15.         if( !is_numeric($formula[$i])
  16.         &&  $formula[$i] != '+'
  17.         &&  $formula[$i] != '-'
  18.         &&  $formula[$i] != '*'
  19.         &&  $formula[$i] != '/'
  20.         &&  $formula[$i] != '('
  21.         &&  $formula[$i] != ')'
  22.         &&  $formula[$i] != ','
  23.         &&  $formula[$i] != '^'
  24.         &&  $formula[$i] != 'a'
  25.         &&  $formula[$i] != 'c'
  26.         &&  $formula[$i] != 'e'
  27.         &&  $formula[$i] != 'g'
  28.         &&  $formula[$i] != 'i'
  29.         &&  $formula[$i] != 'l'
  30.         &&  $formula[$i] != 'r'
  31.         &&  $formula[$i] != 's'
  32.         &&  $formula[$i] != 't'    
  33.         ){
  34.             $errors = true;
  35.             break;
  36.         }
  37.        
  38.        
  39.         // Verify numbers of brackets
  40.         if($formula[$i]=='(') $numParentesi++;
  41.         if($formula[$i]==')') $numParentesi--;
  42.        
  43.        
  44.         if($formula[$i]===')'){                             // (
  45.             if( isset($formula[$i+1])
  46.                 &&  $formula[$i+1]!='+'
  47.                 &&  $formula[$i+1]!='-'
  48.                 &&  $formula[$i+1]!='*'
  49.                 &&  $formula[$i+1]!='/'
  50.                 &&  $formula[$i+1]!=')'
  51.                 &&  $formula[$i+1]!='^'
  52.             ){
  53.                 $errors = true;
  54.                 break;
  55.             }
  56.             continue;
  57.         }
  58.  
  59.        
  60.         if(is_numeric($formula[$i])                         // Numbers
  61.         ){
  62.             if( isset($formula[$i+1])
  63.             &&  $formula[$i+1]!='+'
  64.             &&  $formula[$i+1]!='-'
  65.             &&  $formula[$i+1]!='*'
  66.             &&  $formula[$i+1]!='/'
  67.             &&  $formula[$i+1]!=')'
  68.             &&  $formula[$i+1]!='^'
  69.             &&  $formula[$i+1]!=','
  70.             &&  !is_numeric($formula[$i+1])
  71.             ){
  72.                 $errors = true;
  73.                 break;
  74.             }
  75.             continue;
  76.         }
  77.        
  78.        
  79.         if( $formula[$i]=='('               // '('
  80.         ||  $formula[$i]=='+'               // '+'
  81.         ||  $formula[$i]=='*'               // '*'
  82.         ||  $formula[$i]=='/'               // '/'
  83.         ||  $formula[$i]=='^'               // '^'
  84.         ){
  85.             $foundComma = false;
  86.             if( (
  87.                 isset($formula[$i+1])   && (
  88.                     $formula[$i+1]=='+'             // a++b not allowed
  89.             //  ||  $formula[$i+1]=='-'             // a+-b allowed
  90.                 ||  $formula[$i+1]=='*'
  91.                 ||  $formula[$i+1]=='/'
  92.                 ||  $formula[$i+1]=='^'
  93.                 ||  $formula[$i+1]==','
  94.                 ||  $formula[$i+1]==')'
  95.                 )
  96.                 )
  97.                 || ($i+1 == count($formula))
  98.             ){
  99.                 $errors = true;
  100.                 break;
  101.             }
  102.             if($formula[$i]=='+' && isset($formula[$i+1]) && isset($formula[$i+2]) && $formula[$i+1] =='-' && $formula[$i+2] =='+'){    // a+-+b not allowed
  103.                 $errors = true;
  104.                 break;
  105.             }
  106.             continue;
  107.         }
  108.         if( $formula[$i]=='-'               // '-'
  109.         ){
  110.             $foundComma = false;
  111.             if( (
  112.                 isset($formula[$i+1])   && (
  113.                 //  $formula[$i+1]=='+' ||  // a-+b allowed
  114.                     $formula[$i+1]=='-'     // a--b not allowed
  115.                 ||  $formula[$i+1]=='*'
  116.                 ||  $formula[$i+1]=='/'
  117.                 ||  $formula[$i+1]=='^'
  118.                 ||  $formula[$i+1]==','
  119.                 ||  $formula[$i+1]==')'
  120.                 )
  121.                 )
  122.                 || ($i+1 == count($formula))
  123.             ){
  124.                 $errors = true;
  125.                 break;
  126.             }
  127.             if(isset($formula[$i+1]) && isset($formula[$i+2]) && $formula[$i+1] =='+' && $formula[$i+2] =='-'){     // a-+-b not allowed
  128.                 $errors = true;
  129.                 break;
  130.             }
  131.             continue;
  132.         }
  133.        
  134.        
  135.         if( $formula[$i]==','               // ','
  136.         ){
  137.             if($foundComma){                // if i matched a comma
  138.                 $errors = true;
  139.                 break;
  140.             }
  141.             $foundComma = true;
  142.             if( isset($formula[$i+1])   && !(
  143.                     is_numeric($formula[$i+1])
  144.                 )
  145.             ){
  146.                 $errors = true;
  147.                 break;
  148.             }
  149.             continue;
  150.         }
  151.        
  152.        
  153.         // MATH FUNCTIONS
  154.         // abs, atan
  155.         if( $formula[$i] == 'a'){
  156.             if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
  157.                 $errors = true;
  158.                 break;
  159.             } else {
  160.                 if( !(
  161.                     ($formula[$i+1] == 'b' && $formula[$i+2] == 's' && $formula[$i+3] == '(')
  162.                 ||  (isset($formula[$i+4]) && ($formula[$i+1] == 't' && $formula[$i+2] == 'a' && $formula[$i+3] == 'n' && $formula[$i+4] == '('))
  163.                     )
  164.                 ){
  165.                     $errors = true;
  166.                     break;
  167.                 } else {
  168.                     $numParentesi++;
  169.                     if($formula[$i+1] == 'b' && $formula[$i+2] == 's' && $formula[$i+3] == '(') $i = $i+3;
  170.                     else $i = $i+4;
  171.                     if( !isset($formula[$i+1]) || (
  172.                             isset($formula[$i+1])   && (
  173.                             $formula[$i+1]=='+'
  174.                         ||  $formula[$i+1]=='*'
  175.                         ||  $formula[$i+1]=='/'
  176.                         ||  $formula[$i+1]=='^'
  177.                         ||  $formula[$i+1]==')'
  178.                         ||  $formula[$i+1]==','
  179.                             )
  180.                         )
  181.                     ){
  182.                         $errors = true;
  183.                         break;
  184.                     }
  185.                 }
  186.             }
  187.             continue;
  188.         }
  189.  
  190.        
  191.         // ceil, cot, cos
  192.         if( $formula[$i] == 'c'){
  193.             if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
  194.                 $errors = true;
  195.                 break;
  196.             } else {
  197.                 if( !(
  198.                     ($formula[$i+1] == 'o' && $formula[$i+2] == 't' && $formula[$i+3] == '(')
  199.                 ||  ($formula[$i+1] == 'o' && $formula[$i+2] == 's' && $formula[$i+3] == '(')
  200.                 ||  (isset($formula[$i+4]) && ($formula[$i+1] == 'e' && $formula[$i+2] == 'i' && $formula[$i+3] == 'l' && $formula[$i+4] == '('))
  201.                     )
  202.                 ){
  203.                     $errors = true;
  204.                     break;
  205.                 } else {
  206.                     $numParentesi++;
  207.                     if(
  208.                         $formula[$i+1] == 'o' && $formula[$i+2] == 't' && $formula[$i+3] == '('
  209.                     ||  $formula[$i+1] == 'o' && $formula[$i+2] == 's' && $formula[$i+3] == '('
  210.                     ) $i = $i+3;
  211.                     else $i = $i+4;
  212.                     if( !isset($formula[$i+1]) || (
  213.                             isset($formula[$i+1])   && (
  214.                             $formula[$i+1]=='+'
  215.                         ||  $formula[$i+1]=='*'
  216.                         ||  $formula[$i+1]=='/'
  217.                         ||  $formula[$i+1]=='^'
  218.                         ||  $formula[$i+1]==')'
  219.                         ||  $formula[$i+1]==','
  220.                             )
  221.                         )
  222.                     ){
  223.                         $errors = true;
  224.                         break;
  225.                     }
  226.                 }
  227.             }
  228.             continue;
  229.         }
  230.         // exp
  231.         if( $formula[$i] == 'e'){
  232.             if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
  233.                 $errors = true;
  234.                 break;
  235.             } else {
  236.                 if( !(
  237.                     ($formula[$i+1] == 'x' && $formula[$i+2] == 'p' && $formula[$i+3] == '(')
  238.                     )
  239.                 ){
  240.                     $errors = true;
  241.                     break;
  242.                 } else {
  243.                     $numParentesi++;
  244.                     $i = $i+3;
  245.                     if( !isset($formula[$i+1]) || (
  246.                             isset($formula[$i+1])   && (
  247.                             $formula[$i+1]=='+'
  248.                         ||  $formula[$i+1]=='*'
  249.                         ||  $formula[$i+1]=='/'
  250.                         ||  $formula[$i+1]=='^'
  251.                         ||  $formula[$i+1]==')'
  252.                         ||  $formula[$i+1]==','
  253.                             )
  254.                         )
  255.                     ){
  256.                         $errors = true;
  257.                         break;
  258.                     }
  259.                 }
  260.             }
  261.             continue;
  262.         }
  263.         // gmp_fact
  264.         if( $formula[$i] == 'g'){
  265.             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])){
  266.                 $errors = true;
  267.                 break;
  268.             } else {
  269.                 if( !(
  270.                     ($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] == '(')
  271.                     )
  272.                 ){
  273.                     $errors = true;
  274.                     break;
  275.                 } else {
  276.                     $numParentesi++;
  277.                     $i = $i+8;
  278.                     if( !isset($formula[$i+1]) || (
  279.                             isset($formula[$i+1])   && (
  280.                             $formula[$i+1]=='+'
  281.                         ||  $formula[$i+1]=='*'
  282.                         ||  $formula[$i+1]=='/'
  283.                         ||  $formula[$i+1]=='^'
  284.                         ||  $formula[$i+1]==')'
  285.                         ||  $formula[$i+1]==','
  286.                             )
  287.                         )
  288.                     ){
  289.                         $errors = true;
  290.                         break;
  291.                     }
  292.                 }
  293.             }
  294.             continue;
  295.         }
  296.         // intval
  297.         if( $formula[$i] == 'i'){
  298.             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])){
  299.                 $errors = true;
  300.                 break;
  301.             } else {
  302.                 if( !(
  303.                     ($formula[$i+1] == 'n' && $formula[$i+2] == 't' && $formula[$i+3] == 'v' && $formula[$i+4] == 'a' && $formula[$i+5] == 'l' && $formula[$i+6] == '(')
  304.                     )
  305.                 ){
  306.                     $errors = true;
  307.                     break;
  308.                 } else {
  309.                     $numParentesi++;
  310.                     $i = $i+6;
  311.                     if( !isset($formula[$i+1]) || (
  312.                             isset($formula[$i+1])   && (
  313.                             $formula[$i+1]=='+'
  314.                         ||  $formula[$i+1]=='*'
  315.                         ||  $formula[$i+1]=='/'
  316.                         ||  $formula[$i+1]=='^'
  317.                         ||  $formula[$i+1]==')'
  318.                         ||  $formula[$i+1]==','
  319.                             )
  320.                         )
  321.                     ){
  322.                         $errors = true;
  323.                         break;
  324.                     }
  325.                 }
  326.             }
  327.             continue;
  328.         }
  329.         // sin, sqrt
  330.         if( $formula[$i] == 's'){
  331.             if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
  332.                 $errors = true;
  333.                 break;
  334.             } else {
  335.                 if( !(
  336.                     ($formula[$i+1] == 'i' && $formula[$i+2] == 'n' && $formula[$i+3] == '(')
  337.                 ||  (isset($formula[$i+4]) && ($formula[$i+1] == 'q' && $formula[$i+2] == 'r' && $formula[$i+3] == 't' && $formula[$i+4] == '('))
  338.                     )
  339.                 ){ 
  340.                     $errors = true;
  341.                     break;
  342.                 } else {
  343.                     $numParentesi++;
  344.                     if($formula[$i+1] == 'i' && $formula[$i+2] == 'n' && $formula[$i+3] == '(') $i = $i+3;
  345.                     else $i = $i+4;
  346.                     if( !isset($formula[$i+1]) || (
  347.                             isset($formula[$i+1])   && (
  348.                             $formula[$i+1]=='+'
  349.                         ||  $formula[$i+1]=='*'
  350.                         ||  $formula[$i+1]=='/'
  351.                         ||  $formula[$i+1]=='^'
  352.                         ||  $formula[$i+1]==')'
  353.                         ||  $formula[$i+1]==','
  354.                             )
  355.                         )
  356.                     ){ 
  357.                         $errors = true;
  358.                         break;
  359.                     }
  360.                 }
  361.             }
  362.             continue;
  363.         }
  364.         // tan
  365.         if( $formula[$i] == 't'){
  366.             if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
  367.                 $errors = true;
  368.                 break;
  369.             } else {
  370.                 if( !(
  371.                     ($formula[$i+1] == 'a' && $formula[$i+2] == 'n' && $formula[$i+3] == '(')
  372.                     )
  373.                 ){
  374.                     $errors = true;
  375.                     break;
  376.                 } else {
  377.                     $numParentesi++;
  378.                     $i = $i+3;
  379.                     if( !isset($formula[$i+1]) || (
  380.                             isset($formula[$i+1])   && (
  381.                             $formula[$i+1]=='+'
  382.                         ||  $formula[$i+1]=='*'
  383.                         ||  $formula[$i+1]=='/'
  384.                         ||  $formula[$i+1]=='^'
  385.                         ||  $formula[$i+1]==')'
  386.                         ||  $formula[$i+1]==','
  387.                             )
  388.                         )
  389.                     ){
  390.                         $errors = true;
  391.                         break;
  392.                     }
  393.                 }
  394.             }
  395.             continue;
  396.         }
  397.         // log, log10
  398.         if( $formula[$i] == 'l'){
  399.             if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3])){
  400.                 $errors = true;
  401.                 break;
  402.             } else {
  403.                 if( !(
  404.                     ($formula[$i+1] == 'o' && $formula[$i+2] == 'g' && $formula[$i+3] == '(')
  405.                 ||  (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] == '('))
  406.                     )
  407.                 ){
  408.                     $errors = true;
  409.                     break;
  410.                 } else {
  411.                     $numParentesi++;
  412.                     if($formula[$i+1] == 'o' && $formula[$i+2] == 'g' && $formula[$i+3] == '(') $i = $i+3;
  413.                     else $i = $i+5;
  414.                     if( !isset($formula[$i+1]) || (
  415.                             isset($formula[$i+1])   && (
  416.                             $formula[$i+1]=='+'
  417.                         ||  $formula[$i+1]=='*'
  418.                         ||  $formula[$i+1]=='/'
  419.                         ||  $formula[$i+1]=='^'
  420.                         ||  $formula[$i+1]==')'
  421.                         ||  $formula[$i+1]==','
  422.                             )
  423.                         )
  424.                     ){
  425.                         $errors = true;
  426.                         break;
  427.                     }
  428.                 }
  429.             }
  430.             continue;
  431.         }
  432.         // rand, round
  433.         if( $formula[$i] == 'r'){
  434.             if(!isset($formula[$i+1]) || !isset($formula[$i+2]) || !isset($formula[$i+3]) || !isset($formula[$i+4])){
  435.                 $errors = true;
  436.                 break;
  437.             } else {
  438.                 if( !(
  439.                     ($formula[$i+1] == 'a' && $formula[$i+2] == 'n' && $formula[$i+3] == 'd' && $formula[$i+4] == '(')
  440.                 ||  (isset($formula[$i+5]) && ($formula[$i+1] == 'o' && $formula[$i+2] == 'u' && $formula[$i+3] == 'n' && $formula[$i+4] == 'd' && $formula[$i+5] == '('))
  441.                     )
  442.                 ){ 
  443.                     $errors = true;
  444.                     break;
  445.                 } else {
  446.                     $numParentesi++;
  447.                     if($formula[$i+1] == 'a' && $formula[$i+2] == 'n' && $formula[$i+3] == 'd' && $formula[$i+4] == '(') $i = $i+4;
  448.                     else $i = $i+5;
  449.                     if( !isset($formula[$i+1]) || (
  450.                             isset($formula[$i+1])   && (
  451.                             $formula[$i+1]=='+'
  452.                         ||  $formula[$i+1]=='*'
  453.                         ||  $formula[$i+1]=='/'
  454.                         ||  $formula[$i+1]=='^'
  455.                         ||  $formula[$i+1]==')'
  456.                         ||  $formula[$i+1]==','
  457.                             )
  458.                         )
  459.                     ){ 
  460.                         $errors = true;
  461.                         break;
  462.                     }
  463.                 }
  464.             }
  465.             continue;
  466.         }
  467.        
  468.     }
  469.    
  470.     if($numParentesi!=0){
  471.         $errors = true;
  472.     }
  473.    
  474.     return !$errors;
  475. }
  476.  
  477. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement