Jon*_*Jon 52
我知道这个问题已经过时了,但昨晚我在搜索一些不太相关的东西时遇到了它,而且这里的每一个答案都很糟糕.不只是坏,非常糟糕.我在这里给出的例子将来自我在2005年创建的一个类,并且由于这个问题花了几个小时更新PHP5.其他系统确实存在,并且在发布此问题之前就已存在,所以当我eval对PHP的注意事项是:
eval()语言构造非常危险,因为它允许执行任意PHP代码.因此不鼓励使用它.如果您已仔细验证除了使用此构造之外没有其他选项,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它.
在我跳到示例之前,获取我将要使用的类的位置是在PHPClasses或GitHub上.无论是eos.class.php和stack.class.php是必需的,但可以合并到同一个文件.
之所以使用这样一类是,它包括并缀以后缀(RPN)分析器,然后一个RPN解算器.有了这些,您就不必使用该eval功能并将系统打开以防止漏洞.一旦有了这些类,就可以使用以下代码来解决一个简单(更复杂)的等式,例如你的2-1例子.
require_once "eos.class.php";
$equation = "2-1";
$eq = new eqEOS();
$result = $eq->solveIF($equation);
Run Code Online (Sandbox Code Playgroud)
而已!对于大多数方程式,您可以使用这样的解析器,无论如何复杂和嵌套,而不必诉诸"邪恶eval".
因为我真的不希望这只是让我的课程在其中,这里有一些其他的选择.自从我使用它8年以来,我只熟悉自己.^^
Wolfram | Alpha API
Sage
一个相当糟糕的解析器
phpdicecalc
不太确定我之前发现的其他人发生了什么 - 之前在GitHub上遇到过另一个,不幸的是我没有给它添加书签,但它与包含解析器的大型浮点运算有关.
无论如何,我想确保在这里用PHP解决方程的答案并没有指向所有未来的搜索者,eval因为这是谷歌搜索的顶部.^^
dyn*_*mic 14
$operation='2-1';
eval("\$value = \"$operation\";");
Run Code Online (Sandbox Code Playgroud)
要么
$value=eval("return ($op);");
Run Code Online (Sandbox Code Playgroud)
这是eval派上用场的案例之一:
$expression = '2 - 1';
eval( '$result = (' . $expression . ');' );
echo $result;
Run Code Online (Sandbox Code Playgroud)
您可以使用BC Math任意精度
echo bcsub(5, 4); // 1
echo bcsub(1.234, 5); // 3
echo bcsub(1.234, 5, 4); // -3.7660
Run Code Online (Sandbox Code Playgroud)
http://www.php.net/manual/en/function.bcsub.php