ホームページ > バックエンド開発 > PHPチュートリアル > PHP で後置解析に中置を使用して数学的文字列を安全に評価する方法

PHP で後置解析に中置を使用して数学的文字列を安全に評価する方法

Patricia Arquette
リリース: 2025-01-02 22:38:39
オリジナル
392 人が閲覧しました

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

後置解析に中置語を使用した文字列の数学的評価

文字列の数学的評価 (「2-1」で「1、 " を実行するには、文字列をその構成部分に解析する必要があります。 PHP では、数学的評価のデフォルトの方法には eval() 関数の使用が含まれます。これにより、任意の PHP コードが実行され、セキュリティ上の脆弱性が生じる可能性があります。

ただし、より安全なアプローチは、後置パーサーへの中置子を使用して変換することです。文字列を逆ポーランド記法 (RPN) に変換します。 RPN ソルバーは、eval() を必要とせずに結果の式を評価できます。

後置パーサーへの中置子の実装

以下は、後置パーサーへの中置子の実装方法の例です。 PHP を使用した infix から postfix パーサーへの変換クラス:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート