Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有一个输入字段的PHP计算器_Php_Input - Fatal编程技术网

带有一个输入字段的PHP计算器

带有一个输入字段的PHP计算器,php,input,Php,Input,我需要有一个文本输入字段做或不做基本的计算。范例 <input type="text" /> 应该分别给我 14.5 59.3 有人知道这样做的方法、脚本等吗?或者你知道怎么做吗 谢谢。一个快速解决方案是使用substr()检查输入中是否包含任何数学运算符(+、-、…)。如果是这样的话,可以使用eval()(这是一个相当肮脏的黑客行为,因为它接受所有的PHP代码,而不仅仅是数学),或者手动构建适当的操作树,然后生成结果。如果没有数学运算符,只需打印出输入。不使用eval,但您仍需

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

<input type="text" />
应该分别给我

14.5
59.3
有人知道这样做的方法、脚本等吗?或者你知道怎么做吗


谢谢。

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

不使用eval,但您仍需要小心,并捕获任何解析错误,例如尝试计算“')”等。我有一些想法,但会留给读者或另一个雨天


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


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

总是有
eval()
。。。我不敢把它作为一个答案贴出来——我相信它会引来火焰。@Wesley Murch让火焰开始吧!类似:@Wesley:“容易出错”与“安全漏洞”不同@扎夫的回答是对这个问题的解决方案。。。这个问题并没有问到如何保证语法树的有效性。@Tom感谢Tom-我本来打算花一天的时间让它成为防弹的…@Tom:尽管这个问题没有问,但我们在给出建议时真的应该指出这些东西,就像zaf深思熟虑地选择做的那样。除此之外,我觉得必须有一个合法的方法来做这件事。@Wesley Munch也许你/我应该针对这种瘙痒提出一个问题。。。我有一些疯狂的想法…@卫斯理:对你来说,什么才是正确的解决方案?如果输入计算中存在语法错误,此答案将给出一个错误,可以使用异常处理程序将其定向回用户。“PHP计算器”还应该做什么?
14.5
59.3
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  
/^(\(*[\+\-]?\(*[\+\-]?\d+(.\d+)?\)*[\+\-\*\/]?)*$/