【问题标题】:PHP calculator with one input field带一个输入字段的 PHP 计算器
【发布时间】:2011-06-14 06:32:54
【问题描述】:

我需要一个文本输入字段来做或不做基本的计算。示例

<input type="text" />

然后我通过邮递方式提交,邮递员会知道是输入值还是进行计算

值示例

14.5
10.3+14+35

应该分别给我

14.5
59.3

有没有人知道方法、脚本……有什么可以做到这一点的吗?或者对如何去做有任何想法?

谢谢。

【问题讨论】:

标签: php input


【解决方案1】:

不使用 eval,但您仍然需要小心并发现任何解析错误,例如尝试评估 ')' 等。我有想法,但会留给读者或其他未雨绸缪。

reference site

function calculate_string( $mathString ) {

    // trim white spaces
    $mathString = trim($mathString);

    // remove any non-numbers chars; exception for math operators
    $mathString = ereg_replace ('[^0-9\+-\*\/\(\) ]', '', $mathString);

    $compute = create_function("", "return (" . $mathString . ");" );
    return 0 + $compute();

}

$string = " (1 + 1) * (2 + 2)";
echo calculate_string($string);  // outputs 8  

【讨论】:

  • @Wesley:“容易出错”与“安全漏洞”不同。 @zaf 的答案是该问题的解决方案……该问题并未询问有关保证有效语法树的问题。
  • @Tom 谢谢汤姆 - 我正打算用剩下的时间来让它防弹......
  • @Tom:尽管问题没有提出,但我们确实应该在提供建议时指出这些东西,就像 zaf 精心选择的那样。除此之外,我觉得确实必须有一种合法的方式来做到这一点。
  • @Wesley Munch 也许你/我应该专门针对这种痒提出一个问题...我有一些疯狂的想法...
  • @Wesley:对您来说正确的解决方案是什么?如果输入计算中存在语法错误,则此答案会给出错误,可以使用异常处理程序将其引导回用户。 “PHP 计算器”还应该做什么?
【解决方案2】:

使用以下正则表达式可以检查输入是否为有效的数学语法并使用 eval():

/^(\(*[\+\-]?\(*[\+\-]?\d+(.\d+)?\)*[\+\-\*\/]?)*$/

允许的字符是:1 2 3 4 5 6 7 8 9 0。 + - * / ( )

【讨论】:

    【解决方案3】:

    一个快速的解决方案是使用substr() 检查输入是否包含任何数学运算符(+、-、...)。如果是这样,请使用eval() 进行数学运算(相当肮脏的黑客,因为它接受所有 PHP 代码而不仅仅是数学运算)或手动构建适当的操作树,然后生成结果。如果没有数学运算符,只需打印输入即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2016-08-30
      • 1970-01-01
      • 2017-09-30
      • 2011-08-29
      • 1970-01-01
      相关资源
      最近更新 更多