您的正则表达式永远不会匹配单个数字,因为您正在使用{2,}
这意味着匹配一个字符 2 次或更多次。
所以让我们在这里看看这个正则表达式:
#(\d+)\s*([+/*-])\s*(\d+)#
#
: 分隔符
(\d+)
:匹配一个数字一次或多次,然后将其分组。
\s*
: 匹配空格零次或多次
([+/*-])
: 匹配一次+
or-
或*
or/
并分组
\s*
: 匹配空格零次或多次
(\d+)
:匹配一个数字一次或多次,然后将其分组。
#
: 分隔符
让我们在这里使用一些 PHP-Fu 和我在这里使用的函数:
$input = '2 +2
5*3
6 - 8';
$output = preg_replace_callback('#(\d+)\s*([+/*-])\s*(\d+)#', function($m){
return $m[1].' '.$m[2].' '.$m[3].' = '. mathOp($m[2], (int)$m[1], (int)$m[3]);
}, $input); // You need PHP 5.3+. Anonymous function is being used here !
echo $output;
function mathOp($operator, $n1, $n2){
if(!is_numeric($n1) || !is_numeric($n2)){
return 'Error: You must use numbers';
}
switch($operator){
case '+':
return($n1 + $n2);
case '-':
return($n1 - $n2);
case '*':
return($n1 * $n2);
case '/':
if($n2 == 0){
return 'Error: Division by zero';
}else{
return($n1 / $n2);
}
default:
return 'Unknown Operator detected';
}
}
输出:
2 + 2 = 4
5 * 3 = 15
6 - 8 = -2
建议:
负数、括号、log 和 cos/sin 函数会变得相当复杂,所以最好使用解析器。