PHP验证字符串是数学表达式

时间:2016-03-26 23:44:32

标签: php regex

我正在尝试编写一个PHP函数来检查字符串是否代表数学表达式。

这就是我所拥有的:

function is_math( $maybe_math ){
    $pattern = '([-+]?[0-9]*\.?[0-9]+[\/\+\-\*])+([-+]?[0-9]*\.?[0-9])';
    if( 0 === preg_match( $maybe_math, $pattern ) ){
        return true;
    }
}

我正在测试这些可能性:

$valid = is_math( '(1-4*(9*5/1)+1)' ); //true
$invalid = is_math( 'hats'  ); //false
$valid_and_invalid = is_math( '(1-4aaa*(9*5/1)+1k)' ); //true

如您所见,到目前为止,它为数学表达式或具有有效数学字符和无效数学字符的字符串计算true。现在我正在展示的第三个测试应该是假的,因为里面有字母,我不在这里做代数。

我的目标是创建一个函数,我可以用它来验证我的字符串是否可以传递给eval并返回一个数字,而不是冒险执行不安全的代码,因为这些数字部分来自POST数据。

1 个答案:

答案 0 :(得分:0)

您的主要问题是您只查看可能最小的匹配子字符串,而不是整个表达式。

您可以see for yourself从这些表达中匹配的内容。

第一步是将表达式包装在开始和结束匹配(分别为^$)中,包括您的全部允许字符(您与(不匹配或者),例如)并从那里继续。

但实际上,这是一个傻瓜的差事。正则表达式不是为解析数学表达式而设计的;这项练习有一些学习价值,但最终它不能很好地完成。