首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用eval从字符串中计算数学表达式

使用eval从字符串中计算数学表达式
EN

Stack Overflow用户
提问于 2013-09-18 19:33:30
回答 9查看 87K关注 0票数 27

我想从字符串中计算数学表达式。我已经读到,解决这个问题的方法是使用eval()。但是,当我尝试运行以下代码时:

代码语言:javascript
运行
复制
<?php

$ma ="2+10";
$p = eval($ma);
print $p;

?>

它给出了以下错误:

解析错误:语法错误,第1行中的C:\xampp\htdocs\eclipseWorkspaceWebDev\MandatoryHandinSite\tester.php(4):eval()d代码中的意外$end

有人知道这个问题的解决方案吗。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-09-18 19:36:21

虽然我不建议为此使用eval (这不是解决方案),但问题是eval需要完整的代码行,而不仅仅是片段。

代码语言:javascript
运行
复制
$ma ="2+10";
$p = eval('return '.$ma.';');
print $p;

应该做你想做的事。

更好的解决方案是为数学表达式编写一个标记器/解析器。下面是一个非常简单的基于正则表达式的示例:

代码语言:javascript
运行
复制
$ma = "2+10";

if(preg_match('/(\d+)(?:\s*)([\+\-\*\/])(?:\s*)(\d+)/', $ma, $matches) !== FALSE){
    $operator = $matches[2];

    switch($operator){
        case '+':
            $p = $matches[1] + $matches[3];
            break;
        case '-':
            $p = $matches[1] - $matches[3];
            break;
        case '*':
            $p = $matches[1] * $matches[3];
            break;
        case '/':
            $p = $matches[1] / $matches[3];
            break;
    }

    echo $p;
}
票数 72
EN

Stack Overflow用户

发布于 2014-11-22 12:29:02

看看这个..。

我在一个会计系统中使用它,您可以在这个系统中在金额输入字段中编写数学表达式。

示例

代码语言:javascript
运行
复制
$Cal = new Field_calculate();

$result = $Cal->calculate('5+7'); // 12
$result = $Cal->calculate('(5+9)*5'); // 70
$result = $Cal->calculate('(10.2+0.5*(2-0.4))*2+(2.1*4)'); // 30.4

代码

代码语言:javascript
运行
复制
class Field_calculate {
    const PATTERN = '/(?:\-?\d+(?:\.?\d+)?[\+\-\*\/])+\-?\d+(?:\.?\d+)?/';

    const PARENTHESIS_DEPTH = 10;

    public function calculate($input){
        if(strpos($input, '+') != null || strpos($input, '-') != null || strpos($input, '/') != null || strpos($input, '*') != null){
            //  Remove white spaces and invalid math chars
            $input = str_replace(',', '.', $input);
            $input = preg_replace('[^0-9\.\+\-\*\/\(\)]', '', $input);

            //  Calculate each of the parenthesis from the top
            $i = 0;
            while(strpos($input, '(') || strpos($input, ')')){
                $input = preg_replace_callback('/\(([^\(\)]+)\)/', 'self::callback', $input);

                $i++;
                if($i > self::PARENTHESIS_DEPTH){
                    break;
                }
            }

            //  Calculate the result
            if(preg_match(self::PATTERN, $input, $match)){
                return $this->compute($match[0]);
            }
            // To handle the special case of expressions surrounded by global parenthesis like "(1+1)"
            if(is_numeric($input)){
                return $input;
            }

            return 0;
        }

        return $input;
    }

    private function compute($input){
        $compute = create_function('', 'return '.$input.';');

        return 0 + $compute();
    }

    private function callback($input){
        if(is_numeric($input[1])){
            return $input[1];
        }
        elseif(preg_match(self::PATTERN, $input[1], $match)){
            return $this->compute($match[0]);
        }

        return 0;
    }
}
票数 44
EN

Stack Overflow用户

发布于 2018-11-01 14:43:26

我最近创建了一个PHP包,它提供了一个math_eval助手函数。它完全满足您的需要,而不需要使用潜在不安全的eval函数。

您只需传入数学表达式的字符串版本,它就会返回结果。

代码语言:javascript
运行
复制
$two   = math_eval('1 + 1');
$three = math_eval('5 - 2');
$ten   = math_eval('2 * 5');
$four  = math_eval('8 / 2');

您还可以传入变量,如果需要,这些变量将被替换。

代码语言:javascript
运行
复制
$ten     = math_eval('a + b', ['a' => 7, 'b' => 3]);
$fifteen = math_eval('x * y', ['x' => 3, 'y' => 5]);

链接:评估

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18880772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档