使用中綴到後綴解析對字串進行數學計算
字串的數學計算,例如「2-1」產生“ 1, " 需要將字串解析為其組成部分。在 PHP 中,數學求值的預設方法涉及使用 eval() 函數,該函數執行任意 PHP 程式碼,並可能引入安全漏洞。
但是,更安全的方法是使用中綴到後綴解析器來轉換將字串轉換為逆波蘭表示法 (RPN)。然後,RPN 求解器可以計算結果表達式,而不需要 eval()。
實作後綴解析器的中綴
以下是如何實作一個中綴的範例使用 PHP 中綴到後綴解析器類:
class EOS { private $operators = ['+', '-', '*', '/', '^']; private $precedence = [ '*' => 3, '/' => 3, '+' => 2, '-' => 2, '^' => 4 ]; public function solveIF($infix) { $postfix = $this->infixToPostfix($infix); return $this->postfixSolver($postfix); } // Converts infix expression to postfix private function infixToPostfix($infix) { $stack = new Stack(); $postfix = ''; $tokens = explode(' ', $infix); foreach ($tokens as $token) { if (in_array($token, $this->operators)) { while (!$stack->isEmpty() && $this->precedence[$stack->top()] >= $this->precedence[$token]) { $postfix .= $stack->pop() . ' '; } $stack->push($token); } else { $postfix .= $token . ' '; } } while (!$stack->isEmpty()) { $postfix .= $stack->pop() . ' '; } return $postfix; } // Solves postfix expression private function postfixSolver($postfix) { $stack = new Stack(); $tokens = explode(' ', $postfix); foreach ($tokens as $token) { if (in_array($token, $this->operators)) { $operand2 = $stack->pop(); $operand1 = $stack->pop(); $result = $this->evaluateOperator($token, $operand1, $operand2); $stack->push($result); } else { $stack->push($token); } } return $stack->top(); } // Evaluates operators private function evaluateOperator($op, $operand1, $operand2) { switch ($op) { case '+': return $operand1 + $operand2; case '-': return $operand1 - $operand2; case '*': return $operand1 * $operand2; case '/': return $operand1 / $operand2; case '^': return pow($operand1, $operand2); } } }
用法:
$eo = new EOS(); $result = $eo->solveIF("2-1"); echo $result; // Prints 1
其他替代方案:
使用中綴到後綴解析器時是一種安全的數學評估方法,還有其他替代方法可用:
以上是如何使用中綴到後綴解析安全地評估 PHP 中的數學字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!