Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Menilai Rentetan Matematik dengan Selamat dalam PHP Menggunakan Infix to Postfix Parsing?

Bagaimana untuk Menilai Rentetan Matematik dengan Selamat dalam PHP Menggunakan Infix to Postfix Parsing?

Patricia Arquette
Patricia Arquetteasal
2025-01-02 22:38:39419semak imbas

How to Securely Evaluate Mathematical Strings in PHP Using Infix to Postfix Parsing?

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:

  • Wolfram|Alpha API: Menyediakan keupayaan penilaian matematik melalui API.
  • Sage: Sistem perisian matematik sumber terbuka.
  • PHP Dice Calc: Pustaka PHP untuk operasi matematik.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn