首頁 > 後端開發 > php教程 > 如何使用中綴到後綴解析安全地評估 PHP 中的數學字串?

如何使用中綴到後綴解析安全地評估 PHP 中的數學字串?

Patricia Arquette
發布: 2025-01-02 22:38:39
原創
418 人瀏覽過

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

使用中綴到後綴解析對字串進行數學計算

字串的數學計算,例如「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
登入後複製

其他替代方案:

使用中綴到後綴解析器時是一種安全的數學評估方法,還有其他替代方法可用:

  • Wolfram|Alpha API:透過 API 提供數學評估功能。
  • Sage:開源數學軟體系統。
  • PHP Dice Calc:用於數學運算的 PHP 函式庫。

以上是如何使用中綴到後綴解析安全地評估 PHP 中的數學字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板