Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP验证字符串是否为数学表达式_Php_Regex - Fatal编程技术网

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

PHP验证字符串是否为数学表达式,php,regex,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

我试图编写一个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数据

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

你可以从这些表达式中找到匹配的内容

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


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

那么现在的问题是什么?可能是重复的。用php解决方案检查答案:使用php eval函数,这个问题是正确的duplicate@Rizier123-我显示的第三个可能输入值为true,但它有字母。这些不是数字或数学运算符。当传递任何非数字的数学运算符时,如何使其计算为false?我不认为这是alexander.polomodov的重复,因为该答案允许在做代数时使用字母,我尝试在传递给eval()之前验证字符串。我想确保它会给我一个有效的响应,而不是试图通过eval执行不安全的操作。