2016-04-04 10 views
2

数学の問題を取り込もうと試みるのにpreg_match()がありますが、部分的にしか働いていません。それは「プラス」と最後の「1」をキャプチャしていますが、何らかの理由で最初の「1」をキャプチャしません。私は間違って何をしていますか?簡単な数学の問題を取り除くためのPreg_match

$string = "one plus one"; 

if (preg_match("~([0-9]|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|thousand|million|\-|)+(\+|\-|\*|\/|plus|add|minus|subtract|time|multiply|divide)([0-9]|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|thousand|million|\-|)+~", $string, $match)) {  
    print_r($match); 
} 

結果:

Array ([0] => one plus one [1] => [2] => plus [3] => one) 

期待される結果:

Array ([0] => one plus one [1] => one [2] => plus [3] => one) 
+3

繰り返しキャプチャが格納されていません。各繰り返しで、キャプチャグループの内容が新しいもので上書きされます。 –

+0

@CasimiretHippolyteそれでは、どうすればいいのですか? – frosty

答えて

0

あなたはすべてのものとドンを取り込むようにするには、別のものにすべての選択肢を使用して、現在のキャプチャグループを置くことができますtwenty nineのようなものが出現するたびに上書きします。

~ 
[+-]? #number sign e.g. +5 or -5 
((?:\d|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|thousand|million|-|\s)+) #numbers 
([+*/-]|plus|add|minus|subtract|time|multiply|divide) #operation 
\s*[+-]? #number sign e.g. +5 or -5 
((?:\d|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|thousand|million|-|\s)+) #numbers 
~x 

(単に説明および書式に使用される修飾x

+0

しかし、私たちはこのスペースを取り除くことはできません。もし誰かが「三百四十三」と入力すればどうなるでしょうか?これらの数字の間には3つのスペースがあります。 – frosty

+0

また、間にスペースが必要です。なぜなら、私がそれらにマッチした後、テキストを実際の数字に変換する必要があるからです。 – frosty

+0

@frostyああ、私は参照してください。私の答えを更新しました。 – Rizier123

関連する問題