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?
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
http://en.wikipedia.org/wiki/Shunting_yard_algorithm – Wrikken
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. –