2

我正在尝试编写一个正则表达式以在 PHP 中的 if 语句中使用,以检查一个字符串是否包含至少 1 个 +、-、* 或 / 以及至少 2 个数字。它们之间可以有任意数量的空格。

做这个的最好方式是什么?

我尝试在下面编写一个正则表达式,但这似乎与我的测试用例不匹配。

我正在使用的正则表达式是:m/[0-9]{2,}[=-*/]+/

这里有一些可以通过的测试用例:

  1. 2 +2
  2. 5*3
  3. 6 - 8

我的最终目标是用 PHP 构建一个计算器,现在我正在尝试确定哪些输入是有效的数学输入/有效的数学表达式,哪些不是。

4

2 回答 2

1

这将匹配您的测试。

/^
[0-9]+    # first number
\s*       # any whitespace
[+*\/-] # operand
\s*       # any whitespace
[0-9]+    # second number
$/x
于 2013-06-02T21:31:05.417 回答
1

您的正则表达式永远不会匹配单个数字,因为您正在使用{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 函数会变得相当复杂,所以最好使用解析器。

于 2013-06-02T21:32:23.540 回答