2

PHP の if ステートメントで使用する正規表現を作成して、文字列に少なくとも 1 つの +、-、*、または / と少なくとも 2 つの数字が含まれていることを確認しようとしています。それらの間に任意の数のスペースを入れることができます。

これを行う最善の方法は何ですか?

以下の正規表現を書いてみましたが、それは私のテストケースと一致していないようです。

私が使用している正規表現は次のとおりです。m/[0-9]{2,}[=-*/]+/

合格するいくつかのテストケースを次に示します。

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

私の最終的な目標は、PHP で電卓を作成することです。現在、どの入力が有効な数学入力/有効な数式であり、そうでないかを判断しようとしています。

4

2 に答える 2

1

{2,}文字を2回以上一致させる手段を使用しているため、正規表現は1桁の数字と一致しません。
それでは、ここでこの正規表現を見てみましょう。
#(\d+)\s*([+/*-])\s*(\d+)#

  • #: 区切り文字
  • (\d+): 数字を 1 回以上一致させてからグループ化します。
  • \s*: スペースに 0 回以上一致
  • ([+/*-])+:または-または*またはのいずれかを 1 回一致さ/せてグループ化する
  • \s*: スペースに 0 回以上一致
  • (\d+): 数字を 1 回以上一致させてからグループ化します。
  • #: 区切り文字

ここでいくつかの 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

アドバイス:
これは、負の数、括弧、対数、および cos/sin 関数を使用するとかなり複雑になるため、パーサーを使用することをお勧めします。

于 2013-06-02T21:32:23.540 に答える
1

これはテストに一致します。

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