2011-04-27 11 views
6

Pracuję nad projektem, w którym potrzebuję wykonać funkcję, która będzie analizować 4 domyślne operacje matematyczne (dodawanie, odejmowanie, mnożenie, dzielenie). Byłoby miło, gdyby funkcja mogła analizować operacje między nawiasami.Parsowanie operacji matematycznych z PHP

Musimy więc najpierw sprawdzić funkcję mnożenia i dzielenia (powinno to sprawdzić po tym, jak parseruje wszystkie operacje pomiędzy nawiasami, jeśli istnieją, i ta reguła powinna obowiązywać dla nawiasów [największy problem polega na tym, że nawiasy mogą zawierać nawiasy]). Po wykonaniu wszystkich operacji mnożenia i dzielenia, powinien wykonać wszystkie operacje dodawania i odejmowania. Ostateczna liczba powinna być zwrócona przez funkcje.

Kolejnym miłym dodatkiem będzie ciąg RegExp, który sprawdzi operacje matematyczne.

Z góry dziękuję!

+2

Dla Twojego problemu z nawiasami: powinieneś nauczyć się rekursji, aby nauczyć się rekursji –

+0

"Pytanie" zaczyna się od "Pracuję nad projektem", ale szybko staje się listą życzeń. – pavium

+2

Brzmi jak zadanie domowe. Czy to jest problem domowy? – KyleWpppd

Odpowiedz

4

To powinno być dość bezpieczne:

function do_maths($expression) { 
    eval('$o = ' . preg_replace('/[^0-9\+\-\*\/\(\)\.]/', '', $expression) . ';'); 
    return $o; 
} 

echo do_maths('1+1'); 
+0

Co powinienem zmienić, jeśli muszę obsługiwać również liczby zmiennoprzecinkowe? / –

3

Możesz użyć eval() (OSTRZEŻENIE: upewnij się, że wprowadzono operację matematyczną, a nie inne dowolne wejście lub kod php).

$input = "3 + (4 - 2 * 8)/2"; 

eval('$result = ' . $input . ';'); 

echo "The result is $result"; 
+0

Zastanawiam się, czy byłoby możliwe stworzenie eval() 100% bezpiecznego dla wyrażeń matematycznych, jeśli miałbyś sprawdzić jakąś nierozpoznaną postać; tj. 'preg_replace ('~ [^ 0-9.() - + * /] ~', '', $ input);' – Martijn

+0

@Martijn prawdopodobnie to zadziała, i jest również metodą zastosowaną w zaakceptowanej odpowiedzi. –

0

Wyrażenia regularne nie są tutaj odpowiedzią; Sugeruję użycie expression tree, gdzie wszystkie węzły końcowe są stałymi lub zmiennymi, a pozostałe węzły są operatorami. Na przykład, 2 + 3 * 4 staje:

+ --- 2 
    | 
    --- * --- 3 
     | 
     --- 4 

Następnie należy ocenić ekspresję stosując depth-first traversal. W PHP trudno jest reprezentować drzewa, ale możesz użyć wbudowanej biblioteki, którą komentator zasugerował lub reprezentował przy użyciu asocjacyjnej tablicy tablic.

0

jeśli chcesz naprawdę bezpieczny Parser matematyczny, a następnie eval tego nie zrobi. bcParserPHP może to zrobić. Jest zaimplementowany w PHP i nie używa eval, więc jest bardzo bezpieczny.