IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

évaluer une chaine en tant que calcul


Sujet :

Langage PHP

  1. #1
    Membre habitué

    Homme Profil pro
    Developpeur web
    Inscrit en
    Septembre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 225
    Points : 180
    Points
    180
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result = fonction('(5+5)*2'); // retourne 20
    Bien sur, je pourrais bricoler avec eval mais ce n'est pas très propre

  2. #2
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 153
    Points
    153
    Par défaut
    euh pourquoi tu peu pas enlever les quotes et remplacer les chiffres par des variables?

  3. #3
    Membre habitué

    Homme Profil pro
    Developpeur web
    Inscrit en
    Septembre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 225
    Points : 180
    Points
    180
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    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.

  5. #5
    Membre habitué

    Homme Profil pro
    Developpeur web
    Inscrit en
    Septembre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 225
    Points : 180
    Points
    180
    Par défaut
    Ah bon ? je ne vois pas trop tu pourrais me montrer un exemple stp ?

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Tu peux faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ^^).

  7. #7
    Membre habitué

    Homme Profil pro
    Developpeur web
    Inscrit en
    Septembre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 225
    Points : 180
    Points
    180
    Par défaut
    J'ai essayé mais ça affiche tout le temps 1 :s

  8. #8
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Plutôt comme ça en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    }

  9. #9
    Membre habitué

    Homme Profil pro
    Developpeur web
    Inscrit en
    Septembre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 225
    Points : 180
    Points
    180
    Par défaut
    super ! merci je ne connaissais pas le 'return' dans eval..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage d'une fonction en tant que paramètre
    Par bagnolm dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2006, 16h58
  2. utilisation d"une variable en tant que motif de
    Par bilout dans le forum Langage
    Réponses: 4
    Dernier message: 26/03/2006, 21h19
  3. Réponses: 4
    Dernier message: 20/02/2006, 01h33
  4. [FTP] Définir une variable en tant que constante
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 15/01/2006, 12h39
  5. Réponses: 20
    Dernier message: 07/12/2005, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo