2010-10-07 5 views
1

J'essaye de faire une fonction en PHP qui va évaluer une expression mathématique - y compris des fonctions telles que sin, cos, etc. Mon approche est de supprimer tout les caractères de la phrase qui ne sont pas des nombres, des opérateurs mathématiques ou des fonctions mathématiques, puis utilisent cette chaîne dans un eval(). Le problème est que je ne connais pas assez les expressions régulières pour annuler les caractères et les expressions dans la même expression.Excluant tous les caractères NON dans la liste et PAS dans une liste d'expressions

Jusqu'à présent, ce que j'ai:

$input = preg_replace("/[^0-9+\-.*\/()sincota]/", "", $input); 

De toute évidence, les caractères sin, cos et tan peut être utilisé dans un ordre quelconque dans l'expression d'entrée (plutôt que ne permettant les phrases sin, cos et tan). Si j'étends encore plus cette fonction pour inclure encore plus de caractères et de fonctions, cela présente un risque de sécurité encore plus grand car un utilisateur malicieux pourrait exécuter à peu près n'importe quelle commande PHP grâce à une interaction intelligente avec l'application.

Quelqu'un peut-il me dire comment réparer mon regex et éliminer ce problème?

+0

Hmm, il y a une raison la plupart des langues renvoient des erreurs de syntaxe plutôt que d'essayer une meilleure estimation, qui se trouve de la folie façon (et vous devez être un très bon devineur dans certains cas). Votre solution est toujours un analyseur plutôt que regex (vraiment, ce n'est pas si difficile), et voilà, pas de peur d'exécuter 'n'importe quelle commande PHP'. 'eval = -evil' (dans la plupart des cas ...) – Wrikken

+1

http://en.wikipedia.org/wiki/Shunting_yard_algorithm – Wrikken

+0

Merci, Wrikken. Je n'ai pas vu cela depuis plus d'une décennie et l'avais (plutôt peu) oublié. Je suppose que je vais devoir écrire un analyseur au lieu de simplement essayer de sortir avec une solution rapide. –

Répondre

1

Je tente de faire une fonction dans PHP qui évaluera une expression mathématique - y compris des fonctions telles que sin, cos, etc

Puis-je suggérer en profitant des années de travail qui a été mis en PHPExcel, qui comprend déjà un analyseur de formule. Il comprend cos, sin et des centaines d'autres.

Sinon, plutôt que de nier, vous pouvez rechercher des matchs positifs:

$matches = array(); 
preg_match_all("#([0-9,/\*()+\s\.-]|sin|cos)+#", 'sin(12) + cos(13.5/2) evddal * (4-1)', $matches); 
echo implode('', $matches[0]); 

/* output: 
sin(12) + cos(13.5/2) * (4-1) 
*/ 
0

Vous pouvez essayer ceci:

preg_replace("/(sin|cos|tan)?[^0-9+\\.*\/()-]/", "$1", $input); 

code on ideone.com

Mais si vous essayez d'analyser une expression pour l'évaluer, je vous suggère de Parse et de ne pas simplement passer à travers un modèle d'expression régulière.

Questions connexes