Opération mathématique fournie par l'utilisateur

Petit nouveau ! | 7 Messages

19 oct. 2013, 18:10

Bonjour ! :)
Je ne sais pas si ce sujet a vraiment se place dans "PHP avancé", mais bon je ne pense pas non plus qu'il devrait être dans "PHP débutant". Bref.

J'ai besoin de calculer une opération mathématique fournie et transmit par l'utilisateur via POST ou GET. Exemple :

page.php?v=(2+5)*8-1+(8/4)
Je veux pouvoir, en traitant $_GET['v'], récupérer le nombre 57. J'ai besoin de pouvoir calculer cette opération.
Or, pour PHP ce n'est que du texte, ce qui est tout à fait logique.

Ça doit être possible à coups de loooongues Regex, mais je n'y arriverais pas.

Quelqu'un sait-il comment faire ? Merci ! :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 oct. 2013, 20:37

Salut,

Tu peux utiliser la fonction eval pour cela mais attention a ce que l'on pourrait y passer ce serait une faille de sécurité.
Tu peux valider une opération mathématique avec une expression régulière (chiffres parenthèses le point et les opérateurs mathématiques voulue).


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

20 oct. 2013, 10:19

Tu peux te pencher sur les automates à pile : validation et calcul simultanés.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 7 Messages

20 oct. 2013, 19:12

Salut,

Tu peux utiliser la fonction eval pour cela mais attention a ce que l'on pourrait y passer ce serait une faille de sécurité.
Tu peux valider une opération mathématique avec une expression régulière (chiffres parenthèses le point et les opérateurs mathématiques voulue).
@+
Salut,
Je vais regarder du coté de la fonction eval. Merci ! ;)
Je ne saurais pas faire une expression régulière aussi complexe. N'en existe-t-il pas déjà ?

Tu peux te pencher sur les automates à pile : validation et calcul simultanés.
Qu'est-ce que les automates à pile ?

Eléphant du PHP | 170 Messages

21 oct. 2013, 15:53

Bonjour,
Je ne saurais pas faire une expression régulière aussi complexe
moogli proposait de vérifier avec une expression régulière qu'il n'y ait que des "chiffres parenthèses le point et les opérateurs mathématiques voulue"

Donc si il y a autre chose que des "chiffres parenthèses le point et les opérateurs mathématiques voulue" => on n'utilise pas eval()

D'abord un tuto qui explique tout :
http://lumadis.be/regex/tuto_pcre.php
et en particulier :
http://lumadis.be/regex/tuto_pcre.php#classecar

un exemple avec juste les chiffres et le point :
<?php
$v='123.4';
if(preg_match('#[^0-9.]#', $v))
{
	echo 'nok';
}
else
{
	echo 'ok';
}
?>
attention : dans une classe de caractères, le caractère "-" (moins) a une signification particulière, il faut donc le protéger par un anti-slash (\-).

Rq : avec cette méthode on ne sait pas si l'opération arithmétique est valide, mais au pire on aura un "parse error" (qu'on peut cacher)

Relis bien l'avertissement de la commande eval()

Mammouth du PHP | 2278 Messages

23 oct. 2013, 08:01

google:
automates à piles
C'est une méthode d'analyse syntaxique qui sert entre autres à transformer une exp math en polonaise inversée.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 7 Messages

23 oct. 2013, 15:06

J'ai essayé d'utiliser la fonction eval !
Seulement, ça marche pas. Je dois sûrement mal m'y prendre.
<?php
$operation = $_POST['operation'];
echo '$operation :';
var_dump($operation);

eval('$resultat = $operation;');

echo '$resultat :';
var_dump($resultat);
?>
Et voici le résultat pour $_POST['operation'] = '5+5' :

Image

Donc en fait vu que $_POST['operation'] est de type string, je n'arrive pas à exécuter l'opération via eval.
Quand je convertit $POST['operation'] en int, c'est encore pire : "5+5" se transforme en "5".

Où est-ce que c'est que je me trompe ?

Eléphant du PHP | 170 Messages

23 oct. 2013, 16:07

Dans ton code remplace eval par echo, tu vas tout de suite comprendre :)

Mammouth du PHP | 2278 Messages

23 oct. 2013, 20:14

Je persiste à dire qu'il faut un véritable analyseur, ou une regex particulièrement soignée, encore que les liens que j'ai vus pensent en général que les regex ne suffisentp as
Il y a ça que je n'ai pas testé:
https://gist.github.com/ircmaxell/1232629
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD