字符串是数学表达式吗?

时间:2015-03-17 18:00:47

标签: php math

如何找到string是否为数学表达式?

理解基本数学表达式+, - ,x,/

就足够了

例如:

"1+1" => TRUE

"2 / 2" => TRUE

"hello" => FALSE

"1 * 2 - X" => FALSE

"me + u" => FALSE

3 个答案:

答案 0 :(得分:1)

class MathExpression {

    private static $parentheses_open = array('(', '{', '[');
    private static $parentheses_close = array(')', '}', ']');

    protected static function getParenthesesType( $c ) {
        if(in_array($c,MathExpression::$parentheses_open)) {
            return array_search($c, MathExpression::$parentheses_open);
        } elseif(in_array($c,MathExpression::$parentheses_close)) {
            return array_search($c, MathExpression::$parentheses_close);
        } else {
            return false;
        }
    }

    public static function validate( $expression ) {
        $size = strlen( $expression );
        $tmp = array();
        for ($i=0; $i<$size; $i++) {
            if(in_array($expression[$i],MathExpression::$parentheses_open)) {
                $tmp[] = $expression[$i];
            } elseif(in_array($expression[$i],MathExpression::$parentheses_close)) {
                if (count($tmp) == 0 ) {
                    return false;
                }
                if(MathExpression::getParenthesesType(array_pop($tmp)) 
                    != MathExpression::getParenthesesType($expression[$i])) {
                    return false;
                }
            }
        }
        if (count($tmp) == 0 ) {
            return true;
        } else {
            return false;
        }
    }
}

//Mathematical expressions to validate
$tests = array(
    '(A1+A2*A3)+A5+(B3^B5)*(C1*((A3/C2)+(B2+C1)))',
    '(A1+A2*A3)+A5)*C1+(B3^B5*(C1*((A3/C2)+(B2+C1)))',
    '(A1+A2*A3)+A5++(B2+C1)))',
    '(A1+A2*A3)+A5+(B3^B5)*(C1*(A3/C2)+(B2+C1))'
);

// running the tests...
foreach($tests as $test) {
    $isValid = MathExpression::validate( $test );
    echo 'test of: '. $test .'<br>';
    var_dump($isValid);
}

您可以在Is there possible to check mathematical expression string?

查看并详细了解解决方案

另见eval。例如,您可以这样做:

$result = INF;
try { 
  eval("$result=" + myMathExpression);  // Evaluate here
} catch (Exception $e) { 

} 
if($result != INF) echo("Expression is a valid mathematical expression.");

详细了解there

答案 1 :(得分:0)

一个非常简单的解决方案: 正则表达式编号,空格,[+,/,*, - ,=],空格,子串(此处递归) 将适用于任何序列 1 + 1 + 2 + ... + 1 = 2 + 3 + 4 = 1 * 4 ...... 等

显然不会检查表达是否合法。

根据请求,伪代码:

if  Regex(^(([0-9]+)(\s*)([+,/,*,-,=])(\s*)([0-9]+)(\s*)([+,/,*,-,=])(\s*)))
    if (recursion())
         return True;
    else
         return False;
else //checking for end point
    if Regex(^(([0-9]+)(\s*)([+,/,*,-,=])(\s*)([0-9]+)))
         return True;
    else
         return False;

答案 2 :(得分:-1)

也许是一个带有这样模式的正则表达式:

^([-+/*]\d+(\.\d+)?)*