Heim > Backend-Entwicklung > PHP-Tutorial > Wie kann ich mathematische Zeichenfolgen in PHP mithilfe der Infix-zu-Postfix-Analyse sicher auswerten?

Wie kann ich mathematische Zeichenfolgen in PHP mithilfe der Infix-zu-Postfix-Analyse sicher auswerten?

Patricia Arquette
Freigeben: 2025-01-02 22:38:39
Original
392 Leute haben es durchsucht

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

Mathematische Auswertung von Strings unter Verwendung von Infix zum Postfix-Parsing

Mathematische Auswertung von Strings, z. B. „2-1“, um „1, " erfordert das Parsen der Zeichenfolge in ihre Bestandteile. In PHP umfasst die Standardmethode für die mathematische Auswertung die Verwendung der Funktion eval(), die beliebigen PHP-Code ausführt und möglicherweise Sicherheitslücken mit sich bringt.

Ein sichererer Ansatz besteht jedoch darin, zur Konvertierung einen Infix-zu-Postfix-Parser zu verwenden die Zeichenfolge in die umgekehrte polnische Notation (RPN) um. Ein RPN-Solver kann dann den resultierenden Ausdruck auswerten, ohne dass eval() erforderlich ist.

Implementieren eines Infix-to-Postfix-Parsers

Unten finden Sie ein Beispiel für die Implementierung eines Infix zum Postfix-Parser mithilfe eines PHP Klasse:

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);
    }
  }
}
Nach dem Login kopieren

Verwendung:

$eo = new EOS();
$result = $eo->solveIF("2-1");
echo $result; // Prints 1
Nach dem Login kopieren

Zusätzliche Alternativen:

Bei Verwendung eines Infixes zum Postfix-Parser Da es sich um eine sichere Methode zur mathematischen Auswertung handelt, gibt es weitere Alternativen verfügbar:

  • Wolfram|Alpha API: Bietet mathematische Auswertungsfunktionen über eine API.
  • Sage: Ein Open-Source-Mathematik-Softwaresystem.
  • PHP Dice Calc: Eine PHP-Bibliothek für mathematische Operationen.

Das obige ist der detaillierte Inhalt vonWie kann ich mathematische Zeichenfolgen in PHP mithilfe der Infix-zu-Postfix-Analyse sicher auswerten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage