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


PHP Validate that a string is a mathematical expression

我正在尝试编写一个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数据。

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

你可以从这些表情中看到匹配的内容。

第一步是用起始匹配和结束匹配(分别为^$)包装表达式,包括允许的完整字符集(例如,()没有匹配项),然后继续。

但实际上,这是一件愚蠢的事。正则表达式不是为解析数学表达式而设计的;这个练习有一定的学习价值,但最终还是做不好。