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
Lepaskan: 2025-01-02 22:38:39
asal
418 orang telah melayarinya

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);
    }
  }
}
Salin selepas log masuk

Penggunaan:

$eo = new EOS();
$result = $eo->solveIF("2-1");
echo $result; // Prints 1
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan