我很难找到最好的方法来做到这一点。基本上我提供了类似这样的字符串,其任务是打印出解析过数学的字符串。
杰克通过考试的几率为[0.8 * 100]%。凯蒂有[(0.25 + 0.1)* 100]%的几率。
数学方程总是用方括号括起来。为什么我要处理这样的字符串是一个很长的故事,但我真的很感激帮助!
答案 0 :(得分:3)
PHP有很多数学评估库。快速网络搜索会显示this one。
编写自己的解析器也是一个选项,如果它只是基本的算术,那么它不应该太困难。有了这些资源,我就会远离这个。
您可以采用更简单的方法并使用eval。首先要小心清理输入。在eval docs's page上,有代码的注释要做。这是一个例子:
免责声明:我知道eval只是一个邪恶的拼写错误,这是一个可怕的可怕的事情,所有这一切。如果使用得当,它有用途。
<?php
$test = '2+3*pi';
// Remove whitespaces
$test = preg_replace('/\s+/', '', $test);
$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functions = '(?:sinh?|cosh?|tanh?|abs|acosh?|asinh?|atanh?|exp|log10|deg2rad|rad2deg|sqrt|ceil|floor|round)'; // Allowed PHP functions
$operators = '[+\/*\^%-]'; // Allowed math operators
$regexp = '/^(('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?2))?)+$/'; // Final regexp, heavily using recursive patterns
if (preg_match($regexp, $q))
{
$test = preg_replace('!pi|π!', 'pi()', $test); // Replace pi with pi function
eval('$result = '.$test.';');
}
else
{
$result = false;
}
?>
答案 1 :(得分:2)
preg_match_all('/\[(.*?)\]/', $string, $out);
foreach ($out[1] as $k => $v)
{
eval("\$result = $v;");
$string = str_replace($out[0][$k], $result, $string);
}
如果字符串是用户输入,则此代码高度危险,因为它允许任意任意代码被执行
答案 2 :(得分:0)
从PHP文档示例更新了eval方法。
<?php
function calc($equation)
{
// Remove whitespaces
$equation = preg_replace('/\s+/', '', $equation);
echo "$equation\n";
$number = '((?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?|pi|π)'; // What is a number
$functions = '(?:sinh?|cosh?|tanh?|acosh?|asinh?|atanh?|exp|log(10)?|deg2rad|rad2deg|sqrt|pow|abs|intval|ceil|floor|round|(mt_)?rand|gmp_fact)'; // Allowed PHP functions
$operators = '[\/*\^\+-,]'; // Allowed math operators
$regexp = '/^([+-]?('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?1))?)+$/'; // Final regexp, heavily using recursive patterns
if (preg_match($regexp, $equation))
{
$equation = preg_replace('!pi|π!', 'pi()', $equation); // Replace pi with pi function
echo "$equation\n";
eval('$result = '.$equation.';');
}
else
{
$result = false;
}
return $result;
}
?>
答案 3 :(得分:-2)
听起来,就像你的作业......但无论如何。
你需要使用字符串操作php有很多内置函数让你好运。查看explode()函数以确定和str_split()。
以下是与字符串具体相关的完整功能列表:http://www.w3schools.com/php/php_ref_string.asp
祝你好运。