как перевести математические выражения в строке в целое число - PullRequest
0 голосов
/ 17 ноября 2011

Например, у меня есть утверждение:

$var = '2*2-3+8'; //variable type is string

Как сделать так, чтобы оно было равным 9?

Ответы [ 4 ]

7 голосов
/ 17 ноября 2011

С этой страницы , очень классное (простое) регулярное выражение проверки правильности вычислений, написанное Ричардом ван Велзеном . Если у вас есть это, и оно совпадает, вы можете быть уверены, что можете использовать eval поверх строки. Всегда проверяйте правильность ввода перед использованием eval!

<?php
$regex = '{
    \A        # the absolute beginning of the string
    \h*        # optional horizontal whitespace
    (        # start of group 1 (this is called recursively)
    (?:
        \(        # literal (

        \h*
        [-+]?        # optionally prefixed by + or -
        \h*

        # A number
        (?: \d* \. \d+ | \d+ \. \d* | \d+) (?: [eE] [+-]? \d+ )?

        (?:
            \h*
            [-+*/]        # an operator
            \h*
            (?1)        # recursive call to the first pattern.
        )?

        \h*
        \)        # closing )

        |        # or: just one number

        \h*
        [-+]?
        \h*

        (?: \d* \. \d+ | \d+ \. \d* | \d+) (?: [eE] [+-]? \d+ )?
    )

    # and the rest, of course.
    (?:
        \h*
        [-+*/]
        \h*
        (?1)
    )?
    )
    \h*

    \z        # the absolute ending of the string.
}x';

$var = '2*2-3+8';

if( 0 !== preg_match( $regex, $var ) ) {
    $answer = eval( 'return ' . $var . ';' );
    echo $answer;
}
else {
    echo "Invalid calculation.";
}
1 голос
/ 17 ноября 2011

Что вам нужно сделать, это найти или написать функцию синтаксического анализатора, которая может правильно читать уравнения и фактически вычислять результат. Во многих языках это может быть реализовано с помощью стека, вам следует взглянуть на такие вещи, как постфиксные и инфиксные парсеры и тому подобное.

Надеюсь, это поможет.

0 голосов
/ 17 ноября 2011

Существует intval функция

Но вы не можете напрямую применить к $ var

Для парсера Проверьте это Ответ

0 голосов
/ 17 ноября 2011
$string_with_expression = '2+2';
eval('$eval_result = ' . $string_with_expression)`;

$ eval_result - это то, что вам нужно.

...