Penilaian Matematik Rentetan Menggunakan Infix untuk Postfix Parsing
Penilaian matematik rentetan, seperti "2-1" untuk menghasilkan "1, " memerlukan menghuraikan rentetan ke bahagian konstituennya. Dalam PHP, kaedah lalai untuk penilaian matematik melibatkan penggunaan fungsi eval(), yang melaksanakan kod PHP sewenang-wenangnya dan mungkin memperkenalkan kelemahan keselamatan.
Walau bagaimanapun, pendekatan yang lebih selamat ialah menggunakan infix to postfix parser untuk menukar rentetan ke dalam Notasi Bahasa Poland Songsang (RPN). Penyelesai RPN kemudiannya boleh menilai ungkapan yang terhasil tanpa memerlukan eval().
Melaksanakan Infix to Postfix Parser
Di bawah ialah contoh cara melaksanakan infix to postfix parser menggunakan PHP kelas:
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); } } }
Penggunaan:
$eo = new EOS(); $result = $eo->solveIF("2-1"); echo $result; // Prints 1
Alternatif Tambahan:
Semasa menggunakan infix untuk postfix parser adalah kaedah yang selamat untuk penilaian matematik, terdapat alternatif tambahan tersedia:
Atas ialah kandungan terperinci Bagaimana untuk Menilai Rentetan Matematik dengan Selamat dalam PHP Menggunakan Infix to Postfix Parsing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!