PHP - 在字符串中解析数学方程式

时间:2012-03-17 13:44:37

标签: php regex

我很难找到最好的方法来做到这一点。基本上我提供了类似这样的字符串,其任务是打印出解析过数学的字符串。

杰克通过考试的几率为[0.8 * 100]%。凯蒂有[(0.25 + 0.1)* 100]%的几率。

数学方程总是用方括号括起来。为什么我要处理这样的字符串是一个很长的故事,但我真的很感激帮助!

4 个答案:

答案 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

祝你好运。