2011-07-29 3 views
1

J'ai des chaînes qui contiennent des problèmes mathématiques simples 1 + 10, 2 + 2, 5-3 ... Je veux pouvoir faire correspondre ces problèmes mathématiques et les remplacer par la solution.Preg_replace problème mathématique simple avec la solution?

Alors que: Jimmy tourne 5 + 5 vendredi. est changé pour: Jimmy fête ses 10 ans vendredi.

Je n'ai pas besoin de multiplication ou de division à ce stade, donc je suppose que c'est relativement simple mais je ne suis pas classiquement formé en PHP. Je suppose que je vais avoir besoin d'un REGEX pour faire correspondre le problème, mais je suis assez perdu de là.

1+10 becomes 11 
2+2 becomes 4 
+0

Quelle partie vous rencontrez des problèmes avec? Formuler l'expression rationnelle appropriée? Faire le calcul? Substituer le résultat dans la chaîne de sortie? –

+0

Comme Oli a dit, quelle est la question ici exactement? –

+1

Vous devrez écrire une expression régulière pour isoler et capturer les deux nombres et l'opérateur. Ensuite, vous analysez l'opérateur et évaluez l'expression (à partir des sections capturées de la regex), et remplacez le modèle original par le résultat de l'évaluation de l'expression. À mesure que vous augmentez la complexité des expressions mathématiques, la pertinence des expressions régulières pour les gérer diminue, et vous pourriez bien avoir besoin d'un analyseur grammatical et lexical pour traiter l'expression, même si vous continuez à utiliser une expression régulière pour isoler les expressions mathématiques. expression. –

Répondre

3

Juste "eval" le remplacement - mais attention, il est eval (Demo):

$subject = 'Jimmy turns 5+5 on Friday, Martha 1+10 on Saturday and Petra is 2*2 today.'; 

$pattern = '~(\d+[*/+-]\d+)~e'; 
#       ^^^ e = eval modifier 

# Jimmy turns 10 on Friday, Martha 11 on Saturday and Petra is 4 today. 
echo preg_replace($pattern, '$1', $subject); 
+2

Utilisation intelligente d'eval, mais méfiez-vous d'eval D = – afuzzyllama

+0

@hakre Merci une tonne, juste ce dont j'avais besoin. –