Rangierbahnhof Implementierung in PHP benötigt, interpretiert und analysiert eine Zeichenfolge, die einen mathematischen Vergleich durchführt und ein boolean Ergebnis zurück

StackOverflow https://stackoverflow.com/questions/3664017

Frage

Ich bin auf der Suche nach etwas, das einer Zeichenfolge in PHP interpretieren kann und führt einfache mathematische Berechnung, und dann ein boolean Ergebnis zurück, ob der Ausdruck wahr oder falsch ist.

Zum Beispiel:

  1. Sue Typen in "3 * {mySalary} / 9 = 10000"
  2. PHP teilt diese in zwei Ausdrücke auf - explode ( '=', string);
  3. PHP nimmt meine Liste der Datenbankfelder und ersetzt jede „{}“ getrennte Felder mit den Daten (typecasted zu int)
  4. PHP wertet dann der mathematische Ausdruck
  5. php vergleicht dann die linke Seite auf die rechte Seite
  6. boolean Ergebnis.

Es klingt vielleicht kompliziert, aber es braucht nur sehr einfach zu sein. Hier sind die Einschränkungen: 1 / mathematische Operatoren sind an: + - / * 2 / Vergleichsoperatoren sind an: => <> = <= 3 / nicht brauchen Gleitkomma-Vergleiche, alles kann mit einem ganzzahligen Ebene erfolgen. So können alle Divisionen abgerundet werden, wenn Bedarf oder einfach sein gerade um das Endergebnis

Es wird immer nur zwei Ausdrücke sein, mit einem Vergleichsoperator. Wenn es irgendeine Art von Fehler überhaupt ist, werden wir nur falsch zurück.

Hat jemand etwas gesehen, das dies schon tun können? Ich weiß, ich kann etwas machen, aber warum neu erfinden das Rad nicht wahr?

Wenn Sie nichts tun, gesehen Sie kümmern einig „Gotcha des“ zur Liste oder Vorbehalt, dass Sie sich vorstellen können, wenn diese zu bauen.

Nachdem ich einige mehr lesen Ich weiß, ich die Yard-Algorithmus Rangieren nutzen könnten. Hat jemand eine Implementierung dieser in PHP?

Ich bin der eval bewusst könnte eine einfache Methode, dies durchzuführen, aber es beunruhigt mich, dass der Benutzer sehr leicht etwas mit dieser Methode oder Ursache Syntaxfehler brechen könnte. Ich würde eher es nicht in der Lösung, oder wenn ich tue, dann würde es brauchen, um fest zu steuern, wie es verwendet wird.

Danke.

Jason

War es hilfreich?

Lösung

Schauen Sie sich die evalMath Klasse auf PHPClasses. Dies sollte so ziemlich alles tun, dass Sie wollen, einschließlich der Variablensubstitution (zB einen Wert für „mySalary“ in Ihrem Beispiel voran, bevor die Auswertung des Ausdrucks)

Andere Tipps

Es gibt ein Ausdrucksparser Motor (Implementierungen für JavaScript + Node , PHP , Python und Actionscript) , github Xpresion (ps. ich bin der Autor)

Der Motor ziemlich flexibel und konfigurierbar, kann man Parsern erstellen, die jeden Ausdruck parsen, die enthält auch benutzerdefinierte Variablen , benutzerdefinierte Funktionen , polymorphe Betreiber und allgemeine n-ary Operatoren (z. B. ternärer if-then-else )

Der Algorithmus ist ganz allgemein (man könnte sagen, eine generalisierte Variation von Rangierbahnhof Algorithmus )

Der Ansatz, den ich nehmen würde, ist:

  1. tokenize der Ausdruck
  2. Parst es in einen abstrakten Syntaxbaum
  3. Variable Ersetzungen durchführen (siehe eifrig Bewertung )
  4. berechnen das Ergebnis

...

  • Der Rangier-Yard-Algorithmus ist eine Möglichkeit, die Schritte 1 und 2
  • zu tun
  • Sie können prüfen, ob der Ausdruck syntaktisch korrekt ist nach dem 2. Schritt
  • Wie Sie berechnen, das Ergebnis hängt davon ab, wie der AST gebaut wird.

Der schwierigste Schritt ist die zweite; Sie müssen Operator Vorrang, Klammern und andere Dinge berücksichtigen, aber es gibt viel Literatur über das (können Sie auch folgen nur, dass Wikipedia-Link)

warum nicht ausführen Sie einfach Variablen Ersatz, und führen Sie dann einen preg_replace("/[^0-9+-*\/]/", '', $inputString) und dann entweder eval() oder create_function() verwenden? Wenn Sie diese verwenden, müssen Sie sicherstellen, dass möglicherweise unsichere „Aussagen“ entfernt werden, deshalb habe ich preg_replace verwendet, so dass es jede Zeichenkette entfernen würde

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top