2016-04-04 29 views
2

Matematik problemlerini denemek ve yakalamak için preg_match() kullanıyorum ama sadece kısmen çalışıyor. “Artı” ve “son” olanı yakalasa da, bir sebepten ötürü ilk olanı yakalamaz. Neyi yanlış yapıyorum?Basit matematik problemlerini yakalamak için 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); 
} 

Sonuç:

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

Beklenen Sonuç:

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

tekrarlanan yakalar saklanmaz. Her tekrarda, yakalama grubu içeriğinin yenisi ile üzerine yazılır. –

+0

@CasimiretHippolyte Peki bunu nasıl yapacağız? – frosty

cevap

0

her şeyi ve don yakalamak, böylece başka birinin içine bütün alternatifleri ile mevcut yakalama grubunu koyabilirsiniz twenty nine gibi bir şeyle karşılaştığınızda her zaman üzerine yazmayın.

~ 
[+-]? #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 

(sadece açıklama ve biçimlendirme için kullanılan Değiştirici x,)

+0

Ama alanı boşa çıkaramayız. Ya biri "Üç yüz kırk altı" yazarsa? Bu sayılar arasında 3 boşluk var. – frosty

+0

Ayrıca, aradaki boşluklara kesinlikle ihtiyacım var çünkü onları eşleştirdikten sonra metni gerçek sayılara çevirmem gerekiyor. – frosty

+0

@frosty Ah Şimdi görüyorum. Cevabımı güncelledi. – Rizier123