Un utilisateur est autorisé à entrer toute équation mathématique qu'ils aiment (avec une variable): p>
Ceux-ci sont stockés comme chaînes dans la base de données. Lorsqu'ils sont récupérés, j'ai besoin de substituer "X" pour un numéro et de vérifier la valeur de l'équation. P>
Comment pourrais-je faire cela? P>
J'avais envisagé d'écrire un analyseur pour déconstruire les cordes et les transformer en équations, mais cela semble cher et problématique. L'autre option est de les transmettre via EVAL (mais je ne suis pas un excellent fan d'utiliser EVAL si je peux l'aider). P>
Des idées? P>
mise à jour:
J'ai aussi besoin de pouvoir obtenir la valeur booléenne de quelque chose comme "(x> 5)". Ce n'est pas possible avec EvalMath P>
Mise à jour 2:
J'ai besoin de tirer beaucoup em> de ces seconde. Je suis envisagé dans Eval dans PHP mais je ne peux pas l'obtenir pour retourner un booléen pour (5> 4), mais j'ai remarqué que JS le ferait ... peut-être que je devrais étudier nœud.js ... p>
Mise à jour 3:
Après avoir essayé d'essayer de sortir de nœud.js (et de l'obtenir pour le travail), je suis retourné et j'ai été évalué pour travailler à PHP Voir: PHP PHP Eval retourner une valeur booléenne? p>
Donc, je vais aller avec Eval avec un filtre très très hardcore sur l'entrée de l'utilisateur. P> x + 5 code> p>
1 - x / 2 code> p>
(x / 3) * (56/13) code> p>
8 Réponses :
Même si vous passez à travers EVAL, vous devrez remplacer X avec un nombre. Le type de stratégie que je serais est de passer de la valeur pour X et de voir quelle est la valeur évaluée. Si c'est plus de 0, j'essaierais un nombre plus petit, et s'il est inférieur à 0, j'essaierais un nombre plus important de récursivement jusqu'à ce qu'il satisfasse une marge d'erreur (<> 0,001%). P>
dépend de ce que vous devez faire, mais de toute façon, le moyen le moins cher de le faire en utilisant une fonction Remplacer pour les variables, puis exécutez l'expression à l'aide de l'EVAL (). phpclasses strong> p>
L'autre bonne option, il navigue sur le Web jusqu'à ce que vous trouviez un analyseur: p
Bien sûr, vous devez d'abord vous assurer que vos formules sont en syntaxe PHP.
La bonne chose est que vous puissiez utiliser n'importe quelle fonction mathématique prise en charge par PHP, la mauvaise chose est, elle n'est jamais agréable d'utiliser l'EVAL () :) P>
http://www.phpclasses.org/package/2695 -Pla-Safe-Evaliment-évaluer-mathématique-expressions.html p>
-1 sympa !!! Il est carrément dangereux avec la saisie de l'utilisateur, comme cela a été indiqué comme une exigence dans cette question.
Malheureusement, EvalMath ne gère pas les choses comme le retour d'un booléen pour (5> 3)
dépend ... p>
Quelle est la complexité qu'il va accepter? Parce que pour les équations mathématiques communes (comme celles que vous avez postées), je ne vois pas trop de problème dans la rédaction d'un analyseur. La principale question problématique serait autour des chiffres et placerait la parenthèse correcte. P>
Mais si les équations vont accepter des entrées «avancées», comme {[(((()]}, ou X², X³ ou d'obtenir davantage de calculs de calcul et d'université différents, les choses peuvent donc devenir folle. P>
Si la complexité atteint la manipulation symbolique, essayez de lire et de rechercher quelque chose à propos de CAS (calculer les systèmes d'algèbre). P>
Bien sûr, je vous recommande extrêmement de créer votre propre système pour les entrées, de la valider et d'évangéliser les utilisateurs pour y attacher des entrées. Rien de trop complexe, mais assez pour vous faire (et les autres) confortables et sûrs pour atteindre ce dont vous avez besoin. P>
My Standard Réponse à cette question Chaque fois qu'il dépasse:
n'utilisez pas Eval (surtout que vous indiquez que c'est une entrée de l'utilisateur) ou réinventez la roue en écrivant votre propre analyseur de formule. P>
Regardez sur le Evalmath classe sur phpclasses. Il devrait faire tout ce que vous avez répercuté ici. P>
RE: Malheureusement, EvalMath ne traite pas de choses comme (x> 5) p > Modifier les lignes 177-179 sur P> if (in_array($token, array('+', '-', '*', '/', '^', '>', '<', '='))) {
Malheureusement, EvalMath ne gère pas de choses comme (x> 5)
@AE - Il n'y a pas beaucoup de travail impliqué pour obtenir EvalMath de manipuler (x> 5), etc. Il semblerait que vous utilisiez bien plutôt Eval () malgré les dangers, mais voyez mon édition pour les modifications concernées.
C'est génial! Je vais lui donner un moment et voir comment ça se passe.
EvalMath a également été mentionné dans une autre question et il est aussi Disponible sur Moodle Repository et à Un autre référentiel
Si vous traitez avec la saisie de l'utilisateur, je resterais à l'écart de Eval. Écrivez un analyseur et briser la formule dans des tableaux imbriqués.
Array ( [0] => - [1] => 1 [2] => Array ( [0] => / [1] => x [2] => 2 ) )
eval n'est pas mauvais !!!!! p>
Oui, il peut supporter complètement votre système si vous écrivez de mauvais code - mais les versions PHP récentes peuvent analyser une expression invalide sans écraser l'ensemble du script. Et il y a beaucoup d'autres moyens d'exposer votre système en écrivant un mauvais code. P>
qui laisse juste la possibilité de la possibilité d'attaques d'injection de code - qui peuvent facilement être évitées en faisant une preg_replace sur tout ce qui n'est pas un caractère sûr (c'est-à-dire 0 .... 9, (,), +, -, *, , ^,.) p>
Preg_Replace Pour que l'expression "Safe" devienne plus gênante si l'expression peut contenir des fonctions telles que le journal (), le péché () ... op indique que ceci est le cas ou non.
D'accord - c'est plus maladroit - mais loin d'être impossible à mettre en œuvre. L'important est d'utiliser la blanchissante plutôt que la liste noire.
Merci pour un eval n'est pas une réponse diabolique :)
Cependant, je ne peux pas être évalué pour retourner un booléen pour '(5> 12)' - des idées?
@Ae peut être $ mybool = eval ("retour !! (5> 12);"); code>
Possibilité légèrement risquée Si vous exécutez votre code sur une boîte Linux consiste à utiliser la commande BC (en veillant à vous assurer d'échapper correctement à vos entrées avant de le donner à la cmd système). Je ne peux pas dire que l'utilisation du système est bien meilleure que les risques d'évaluation, alors je m'attends à quelques bowvotes ici. P>
Si vous avez besoin de faire des choses plus complexes, wolframalpha "rel =" nofollow noreferrer "> wolframalpha.com/developers.html "> Wolframalpha propose une API pour les développeurs.
@Themagician Bonne idée, mais malheureusement, ils doivent être tirés très souvent (des milliers d'entre eux une seconde), donc une API externe ne va pas fonctionner.