後置解析に中置語を使用した文字列の数学的評価
文字列の数学的評価 (「2-1」で「1、 " を実行するには、文字列をその構成部分に解析する必要があります。 PHP では、数学的評価のデフォルトの方法には eval() 関数の使用が含まれます。これにより、任意の PHP コードが実行され、セキュリティ上の脆弱性が生じる可能性があります。
ただし、より安全なアプローチは、後置パーサーへの中置子を使用して変換することです。文字列を逆ポーランド記法 (RPN) に変換します。 RPN ソルバーは、eval() を必要とせずに結果の式を評価できます。
後置パーサーへの中置子の実装
以下は、後置パーサーへの中置子の実装方法の例です。 PHP を使用した infix から postfix パーサーへの変換クラス:
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 中国語 Web サイトの他の関連記事を参照してください。