중위 대 후위 구문 분석을 사용한 문자열의 수학적 평가
"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
추가 대안:
중위를 사용하여 후위 구문 분석기에 사용하는 동안 수학적 평가를 위한 안전한 방법이므로 추가 대안이 있습니다. 사용 가능:
위 내용은 중위 대 후위 구문 분석을 사용하여 PHP에서 수학 문자열을 안전하게 평가하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!