> 백엔드 개발 > PHP 튜토리얼 > 중위 대 후위 구문 분석을 사용하여 PHP에서 수학 문자열을 안전하게 평가하는 방법은 무엇입니까?

중위 대 후위 구문 분석을 사용하여 PHP에서 수학 문자열을 안전하게 평가하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-02 22:38:39
원래의
393명이 탐색했습니다.

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

중위 대 후위 구문 분석을 사용한 문자열의 수학적 평가

"2-1"을 사용하여 "1, " 문자열을 구성 부분으로 구문 분석해야 합니다. PHP에서 수학적 평가를 위한 기본 방법은 임의의 PHP 코드를 실행하고 보안 취약점을 유발할 수 있는 eval() 함수를 사용하는 것입니다.

그러나 더 안전한 접근 방식은 중위 대 후위 파서를 사용하여 변환하는 것입니다. 문자열을 역폴란드 표기법(RPN)으로 변환합니다. 그런 다음 RPN 솔버는 eval()이 필요 없이 결과 표현식을 평가할 수 있습니다.

중위어를 후위 파서로 구현

다음은 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿