Want more features on Pastebin? Sign Up, it's FREE!
Guest

Daniele Mams

By: a guest on Mar 21st, 2014  |  syntax: PHP  |  size: 11.63 KB  |  views: 373  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. ?>
clone this paste RAW Paste Data