Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/08/2008, 18h50   #1
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
Par défaut évaluer une chaine en tant que calcul

Bonjour, je vous expose mon problème :

je cherche une fonction php qui permet d'évaluer une chaine comme un calcul et qui retourne le résultat dans une variable.

Ex:

Code :
1
2
 
$result = fonction('(5+5)*2'); // retourne 20
Bien sur, je pourrais bricoler avec eval mais ce n'est pas très propre
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 21h25   #2
Membre habitué
 
Inscription : août 2006
Messages : 163
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 163
Points : 112
Points : 112
euh pourquoi tu peu pas enlever les quotes et remplacer les chiffres par des variables?
gerald57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 22h33   #3
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
Bien sur, mais le truc c'est que j'ai besoin d'un tel mécanisme pour stocker des informations de cette manière :

Code :
1
2
3
 
$result = '(<valeurDynamique1> * 2) + <valeurDynamique2>';
// je fais un str_replace sur les <valeurDynamique> avant d'utiliser la fonction que je cherche...
Je souhaiterais pouvoir faire cela sans créer de fonction qui me fasse le calcul en ayant les <valeurDynamique> comme arguments...
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 22h36   #4
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 797
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 797
Points : 1 688
Points : 1 688
Salut,
qu'est-ce qui te dérange dans le eval() ? tu peux coller une regex avant pour garder que les caractères que tu veux.
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 22h38   #5
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
Ah bon ? je ne vois pas trop tu pourrais me montrer un exemple stp ?
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 22h49   #6
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 797
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 797
Points : 1 688
Points : 1 688
Tu peux faire un truc du style :

Code :
1
2
3
4
5
6
7
function calc($str) {
$str = preg_replace('`[^()0-9*-+/=]`', '', $str); // ici tu supprimes tous les caractères interdits
return @eval('return '.$str.';') or die("Erreur de calcul dans : ".$str);
}
 
$str = "(ertr12a+4)*5";
echo calc($str);
A priori il ne devrait pas y avoir de trou de sécurité (en tout cas j'en vois pas ^^).
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 22h57   #7
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
J'ai essayé mais ça affiche tout le temps 1 :s
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 22h58   #8
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 797
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 797
Points : 1 688
Points : 1 688
Plutôt comme ça en fait :

Code :
1
2
3
4
5
6
7
8
function calc($str) {
$str = preg_replace('`[^()0-9*-+/=]`', '', $str);
$output = @eval('return '.$str.';');
if(!$output)	{
$output = "Erreur de calcul dans : ".$str;
}
return $output;
}
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 23h03   #9
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
super ! merci je ne connaissais pas le 'return' dans eval..
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h43.


 
 
 
 
Partenaires

Hébergement Web