我正在尝试编写一个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数据。
您的主要问题是,您只查看尽可能小的匹配子字符串,而不是整个表达式。
你可以从这些表情中看到匹配的内容。
第一步是用起始匹配和结束匹配(分别为^
和$
)包装表达式,包括允许的完整字符集(例如,(
或)
没有匹配项),然后继续。
但实际上,这是一件愚蠢的事。正则表达式不是为解析数学表达式而设计的;这个练习有一定的学习价值,但最终还是做不好。