implementazione Scalo di smistamento in PHP necessario, interpretare e analizzare una stringa eseguire un confronto matematico e restituiscono un valore booleano

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

Domanda

Sono alla ricerca di qualcosa in grado di interpretare una stringa in php ed eseguire semplice calcolo matematico, e quindi restituire un risultato booleano sul fatto che l'espressione è vera o falsa.

Ad esempio:

  1. tipi Sue a "3 * {} mysalary / 9 = 10000"
  2. PHP divide questo in due espressioni - esplodere ( '=', archi);
  3. PHP prende il mio elenco di campi di database, e sostituisce ogni "{}" campi delimitati con i dati (typecasted a int)
  4. PHP poi valuta l'espressione matematica
  5. php confronta quindi il lato sinistro al lato destro
  6. risultato booleano prodotto.

Può sembrare complessa, ma ha solo bisogno di essere molto semplice. Qui ci sono i vincoli: 1 gli operatori / matematici sono fissati a: + - / * operatori di 2 / confronto sono fissate a: => <> = <= 3 / non paragoni in virgola mobile bisogno, tutto può essere fatto a un livello intero. Quindi eventuali divisioni possono essere arrotondati in caso di necessità o semplicemente arrotondare il risultato finale

Ci sarà sempre solo due espressioni, con un operatore di confronto. Se non v'è alcun tipo di errore a tutti ci sarà solo return false.

Qualcuno ha visto qualcosa che può fare questo già? So che posso fare qualcosa, ma perché reinventare la ruota destra?

Se non avete visto niente te ne frega di elencare alcuni "di Gotcha" o avvertimento di che si può pensare di quando costruzione di questo.

Dopo aver letto alcune più mi rendo conto che potrei usare il manovra algoritmo cortile . Qualcuno ha un'implementazione di questo in PHP?

Sono consapevole eval potrebbe essere un metodo semplice per eseguire questo, però, mi preoccupa che l'utente potrebbe facilmente rompere qualcosa con questo metodo o causare errori di sintassi. Preferirei non includerlo nella soluzione, o se lo faccio poi avevo bisogno di controllare strettamente come viene utilizzato.

Grazie.

Jason

È stato utile?

Soluzione

Date un'occhiata alla evalMath classe su PHPClasses. Questo dovrebbe fare praticamente tutto ciò che si desidera, compresa la sostituzione di variabile (come ad esempio l'impostazione di un valore per "mysalary" nel tuo esempio prima di valutare l'espressione)

Altri suggerimenti

C'è un motore di espressione parser (implementazioni per JavaScript + Nodo , PHP , Python e ActionScript) , github Xpresion (ps. Sono l'autore)

Il motore è abbastanza flessibile e configurabile, si può creare parser che analizzano ogni espressione che comprende anche variabili definite dall'utente , funzioni definite dall'utente , polimorfici operatori e generali n-ario operatori (es. ternario if-then-else )

L'algoritmo è abbastanza generale (si potrebbe dire, una variazione generalizzata di Scalo di smistamento algoritmo )

L'approccio mi piacerebbe prendere è:

  1. Tokenize l'espressione
  2. Parse in un albero di sintassi astratta
  3. Eseguire le sostituzioni di variabili (vedi desiderosi di valutazione )
  4. Calcolare il risultato

Ora ...

  • L'algoritmo di manovra-cantiere è un modo per fare passi 1 e 2.
  • È possibile controllare se l'espressione è sintatticamente corretto dopo il 2 ° step
  • Come si calcola il risultato dipenderà da come l'AST è costruito.

Il passo più difficile è il 2 °; bisogna considerare precedenza degli operatori, parentesi e altre cose, ma c'è un sacco di letteratura che (si può anche solo seguire quel link wikipedia)

perchè non è sufficiente eseguire variabili sostituzioni, e poi fare un preg_replace("/[^0-9+-*\/]/", '', $inputString), e quindi utilizzare uno o eval() create_function()? Se si utilizza questo è necessario fare in modo che eventualmente pericolosi "dichiarazioni" vengono rimossi, è per questo che ho usato preg_replace, quindi sarebbe cancellare qualunque stringa letterale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top