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 :

Détection de calculs [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Détection de calculs
    Bonjour, pour les besoin d'un projet perso, je souhaiterais savoir si il est possible grâce aux REGEX de tester la présence d'un calcul mathématique simple (2 nombres et 1 opérateur) et de récupérer ce calcul.

    Les opérateur concernés sont + - / *

    Pour essayer d'être un peu plus claire je vais donner un exemple :

    $value = "Combien font 45+8 ?";

    Je souhaiterais que la REGEX analyse $value et me trouve si oui ou non il y a un calcul dans la phrase et si oui qu'elle me le récupère (je ne parle pas de faire le calcul, juste me récupérer le 45+8),
    cela est-il possible aàréaliser ? et si oui, j'aimerais quelques exemples d'application, merci

  2. #2
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    Bonsoir


    Oui, les bases suffisent pour accomplir ça.
    \d+ veut dire toute séquence de 1 ou plusieurs (+) chiffres (\d)
    [+*/-] veut dire un seul des 4 caractères +*/-
    \s* pour possiblement enlever tout blanc entre le nombre et l'opérateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $value = "Combien font 45+8 ?";
     
    preg_match('`\d+\s*[+*/-]\s*\d+`s', $value, $calculs);
    echo preg_replace('`\s+`s', '', $calculs[0]); // pour enlever les blancs 
     
    ?>
    à partir de là je me suis amusé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
     
    $value = "Combien font 45+8 ? Si 150 /5 n'est pas attendu ! Mais que 55- 17 vaut 
    2
    *
    19";
     
    preg_match_all('`\d+\s*[+*/-]\s*\d+`s', $value, $calculs);
    $calculs = preg_replace('`\s+`s', '', $calculs[0]);  
     
    foreach($calculs as $essai) {
      echo eval('return ' . $essai . ';'), '=', $essai, '<br />';
    }
     
    ?>

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Salut Daniel61, je te remerci, c'est exactement ce que je recherchais !
    Maintenant que je sais que cela est possible, peut-on également détecter la présence de calculs avec des nombres a virgule en plus des nombres simples, et détecter des calculs non limités à 2 nombre (45+6-9*3 par exemple) ?

  4. #4
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    Salut
    Le pattern devient plus long, mais ça demeure un agencement des bases
    \d+(,\d+)? veut dire que mon nombre peut-être suivi ou pas d'une virgule et d'un nombre
    (\s*[+*/-]\s*\d+(,\d+)?)+ veut dire de répliquer récursivement la recherche nombre/opérateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $value = "Combien font 45+8 - 6,6* 5,0123 /7?";
     
    preg_match('`\d+(,\d+)?(\s*[+*/-]\s*\d+(,\d+)?)+`s', $value, $calculs);
    echo preg_replace('`\s+`s', '', $calculs[0]); // pour enlever les blancs 
     
    ?>
    Tu peux aussi jeter un oeil sur la fonction token_get_all()

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Sa marche super ! et j'ai compris un peu mieux le principe des REGEX, je te remercie pour cette aide précieuse et je te souhaite une bonne continuation

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/10/2010, 15h13
  2. Réponses: 2
    Dernier message: 05/07/2007, 17h35
  3. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

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