【问题标题】:How to evaluate mathematical formula consist of string? [duplicate]如何评估由字符串组成的数学公式? [复制]
【发布时间】:2016-09-28 10:14:43
【问题描述】:

在 mm 项目中,我想评估作为字符串的数学公式。示例:"((1*10)/100) + 100"

如何评估这样的公式?我使用了eval(),但它抛出了Parse error: syntax error, unexpected end of file 错误并且eval 不是一个安全的函数。

如果我能做到的话,还是这样吗?如果除了 eval 没有办法,那我该怎么做呢?为什么会抛出Parse error: syntax error, unexpected end of file 错误?

【问题讨论】:

  • exec() 允许执行命令,而不是计算数学方程的结果。那是完全不同的东西。该字符串不包含任何命令,因此没有有效的语法。

标签: php math eval mathematical-optimization


【解决方案1】:

这对你有帮助

echo eval('return '. "((1*10)/100) + 100" .';');

【讨论】:

    【解决方案2】:

    php 的exec() 函数允许执行命令,而不是计算数学方程式或公式的结果。那是完全不同的东西。该字符串不包含任何命令,因此它不是有效的语法。

    相反,您需要在对exec() 的调用中输入有效的命令,而不是数学公式:

    看看这个简单的例子:

    <?php
    $input = '((1*10)/100) + 100';
    echo exec('php -r "echo ' . $input . ';"');
    

    这显然需要以php 形式提供的命令行版本的php,以防您尝试从http 服务器中触发它。但同样可以使用任何其他可用的解释器来完成,例如bash

    “内联”替代方案(因此无需分叉外部进程)是使用 php 的 eval() 函数。但同样你需要给它一个命令,而不是一个公式。优点是您不必依赖任何其他工具或解释器即可在运行时使用。对应的例子是:

    <?php
    $input = '((1*10)/100) + 100';
    echo eval('return ' . $input . ';');
    

    两个sn-ps的输出显然都是100.1

    但请注意,这两种方法都必须完全控制您将什么公式输入到执行中。 不允许允许客户端输入传递到这个未经过滤的!这将允许任何攻击者在您的系统上执行任意代码!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多