Я ищу что-то, что может интерпретировать строку в php и выполнять простой математический расчет, а затем возвращать логический результат относительно того, является ли выражение истинным или ложным.
Например:
Это может показаться сложным, но это должно быть очень просто. Вот ограничения: 1 / математические операторы привязаны к: + – / * 2 / операторы сравнения привязаны к: => <> = <= 3 / не нужны сравнения с плавающей запятой, все может быть выполнено на целочисленном уровне. Таким образом, любые деления можно округлить, если нужно, или просто просто округлить конечный результат
Будут только два выражения с одним оператором сравнения. Если есть какая-то ошибка, мы просто вернем false.
Кто-нибудь видел что-то, что может сделать это уже? Я знаю, что могу что-то сделать, но зачем изобретать колесо?
Если вы ничего не заметили, вам не пришло в голову перечислить некоторые «полученные» или оговорки, о которых вы можете придумать при построении этого.
Прочитав еще несколько, я понимаю, что могу использовать алгоритм шунтирования . Кто-нибудь имеет реализацию этого в PHP?
Я знаю, что eval может быть простым способом выполнить это, однако, это касается меня, что пользователь может очень легко сломать что-то с помощью этого метода или вызвать синтаксические ошибки. Я бы предпочел не включать его в решение, или если я это сделаю, тогда ему нужно будет жестко контролировать, как он используется.
Благодарю.
Джейсон
Взгляните на класс evalMath на PHPClasses. Это должно делать почти все, что вам нужно, включая замену переменных (например, задание значения для «mysalary» в вашем примере перед оценкой выражения)
Существует механизм выражения парсера (реализации для JavaScript + Node , PHP , Python и ActionScript), на github Xpresion (ps. Я автор)
Двигатель достаточно гибкий и настраиваемый, можно создавать синтаксические анализаторы, которые анализируют любое выражение, которое также включает определяемые пользователем переменные , определяемые пользователем функции , полиморфные операторы и общие n-арные операторы (например, trernary if-then-else )
Алгоритм достаточно общий (можно сказать, обобщенная вариация алгоритма Шунтинского двора )
Подход, который я возьму, это:
Теперь…
Самый сложный шаг – второй; вы должны рассмотреть приоритет оператора, круглые скобки и другие вещи, но есть много литературы по этому поводу (вы даже можете просто следовать этой ссылке в Википедии)
почему вы просто не выполняете замены переменных, а затем делаете preg_replace("/[^0-9+-*\/]/", '', $inputString)
, а затем используете либо eval()
либо create_function()
? Если вы используете это, вы ДОЛЖНЫ убедиться, что, возможно, небезопасные «инструкции» удалены, поэтому я использовал preg_replace, поэтому он удалял бы любую литеральную строку