Maison >développement back-end >tutoriel php >Comment évaluer en toute sécurité des expressions mathématiques à partir de chaînes en PHP ?

Comment évaluer en toute sécurité des expressions mathématiques à partir de chaînes en PHP ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-27 22:44:17697parcourir

How to Safely Evaluate Mathematical Expressions from Strings in PHP?

Évaluation d'expressions mathématiques à partir de chaînes à l'aide d'Eval

Problème :

Lors de la tentative d'évaluation d'un expression mathématique stockée dans une chaîne à l'aide de eval(), une "erreur d'analyse" se produit, indiquant une fin inattendue de input.

Solution :

Bien qu'il ne soit généralement pas recommandé d'utiliser eval() à cette fin en raison de problèmes de sécurité, la modification de code suivante résout le problème :

$ma = "2+10";
$p = eval('return ' . $ma . ';');
print $p;

En renvoyant explicitement le résultat dans une fonction eval(), le code attend une ligne complète de code.

Solution alternative :

Une solution plus sûre et plus efficace consiste à utiliser un tokenizer/analyseur pour gérer les expressions mathématiques. Voici un exemple simple basé sur une expression régulière :

$ma = "2+10";

if (preg_match('/(\d+)(?:\s*)([\+\-\*\/])(?:\s*)(\d+)/', $ma, $matches) !== FALSE) {
    $operator = $matches[2];

    switch ($operator) {
        case '+':
            $p = $matches[1] + $matches[3];
            break;
        case '-':
            $p = $matches[1] - $matches[3];
            break;
        case '*':
            $p = $matches[1] * $matches[3];
            break;
        case '/':
            $p = $matches[1] / $matches[3];
            break;
    }

    echo $p;
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn