如何在数学上评估像"2-1"这样的字符串来产生"1"?

Nik*_*ola 27 php math numbers eval operators

我只是想知道PHP是否有一个函数可以采用字符串2-1并产生它的算术结果?

或者我是否必须手动执行此操作explode()以获取算术运算符的左右值?

Jon*_*Jon 52

我知道这个问题已经过时了,但昨晚我在搜索一些不太相关的东西时遇到了它,而且这里的每一个答案都很糟糕.不只是坏,非常糟糕.我在这里给出的例子将来自我在2005年创建的一个类,并且由于这个问题花了几个小时更新PHP5.其他系统确实存在,并且在发布此问题之前就已存在,所以当我eval对PHP的注意事项是:

eval()语言构造非常危险,因为它允许执行任意PHP代码.因此不鼓励使用它.如果您已仔细验证除了使用此构造之外没有其他选项,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它.

在我跳到示例之前,获取我将要使用的类的位置是在PHPClassesGitHub上.无论是eos.class.phpstack.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()语言构造非常危险,因为它允许执行任意PHP代码.因此不鼓励使用它.如果您已仔细验证除了使用此构造之外没有其他选项,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它. (2认同)

gio*_*_13 8

这是eval派上用场的案例之一:

$expression = '2 - 1';
eval( '$result = (' . $expression . ');' );
echo $result;
Run Code Online (Sandbox Code Playgroud)


del*_*ist 7

您可以使用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