Я работаю над проектом, где мне нужно создать функцию, которая будет анализировать 4 математические операции по умолчанию (сложение, вычитание, умножение, деление). Было бы неплохо, если бы функция могла анализировать операции между скобками.
Таким образом, обязательным условием является то, что функция сначала проверяет операции умножения и деления (следует проверить это после того, как он проанализирует все операции между скобками, если они существуют, и это правило должно применяться для операций с скобками [самая большая проблема заключается в том, что скобки могут содержать скобки ]). После выполнения всех операций умножения и деления он должен выполнять все операции сложения и вычитания. Окончательное число должно быть возвращено функциями.
Другим приятным дополнением будет строка RegExp, которая будет проверять математические операции.
Заранее спасибо!
Это должно быть довольно безопасно:
function do_maths($expression) { eval('$o = ' . preg_replace('/[^0-9\+\-\*\/\(\)\.]/', '', $expression) . ';'); return $o; } echo do_maths('1+1');
Вы можете использовать eval () ( ПРЕДУПРЕЖДЕНИЕ : убедитесь, что вводится математическая операция, а не какой-либо другой произвольный ввод или php-код).
$input = "3 + (4 - 2 * 8) / 2"; eval('$result = ' . $input . ';'); echo "The result is $result";
была аналогичная проблема
Как оценить формулу, переданную как строку в PHP? вы можете попробовать использовать класс: Eval Math из php-классов http://www.phpclasses.org/package/2695-PHP-Safely-evaluate-mathematics-expressions.html
Регулярные выражения здесь не являются ответом; Я предлагаю использовать дерево выражений, где все конечные узлы являются константами или переменными, а остальные узлы являются операторами. Например, 2 + 3 * 4
становится:
+ --- 2 | --- * --- 3 | --- 4
Затем вы оцениваете выражение, используя обход глубины . В PHP сложно представлять деревья, но вы можете использовать встроенную библиотеку в качестве комментатора, предлагаемого или представляющего их, используя ассоциативный массив массивов.
если вы хотите по-настоящему безопасный математический парсер, тогда eval этого не сделает. bcParserPHP может это сделать. Он реализован в PHP и не использует eval, поэтому он очень безопасен.
Я могу рекомендовать https://github.com/andig/php-shunting-yard, которая является совместимой с PSR-0 реализацией алгоритма Shunting Yard.