Альтернатива для 'eval() uating' условия

В устаревшей кодовой базе, над которой я работаю, есть оценщик условий, который принимает пользовательский ввод для создания условия. Затем это условие оценивается во время выполнения с помощью php eval(). Каков наилучший способ решить эту проблему без использования eval.

Например, У меня есть условие "1>0", введенное пользователем в пользовательском интерфейсе. Это должно быть оценено, и результат (в данном случае истинный) будет возвращен. Какие-либо предложения?

Дайте знать, если проблема кажется расплывчатой, я постараюсь объяснить лучше.


person pinaki    schedule 18.08.2010    source источник
comment
Вы можете создать свой собственный токенизатор или начать со встроенного в PHP, если синтаксис ваших условий достаточно похож: php.net/token-get-all   -  person janmoesen    schedule 18.08.2010


Ответы (2)


парсер evalMath над PHPClasses предоставляет безопасная структура для оценки этого типа выражения.

person Mark Baker    schedule 18.08.2010
comment
+1. я собираюсь попробовать .. есть идеи, что произойдет, если я передам php-функции синтаксическому анализатору? - person pinaki; 18.08.2010
comment
Если вам конкретно нужны функции PHP (например, манипуляции со строками или что-то еще), а не просто математические функции, то их довольно легко добавить в список встроенных функций. - person Mark Baker; 18.08.2010
comment
отлично.. кажется, что подойдет... попробую и посмотрим, к чему это может привести... спасибо за быстрые ответы.. - person pinaki; 18.08.2010
comment
это не работает для условных операторов.. кажется, только оценивает математические операции.. есть идеи? - person pinaki; 18.08.2010
comment
Добавьте условные операторы в массивы $ops, $ops_r и $ops_p в методе nfx(), затем разверните логику if (in_array($token, array('+', '-', '*', ' /', '^'))) { проверка в методе pfx() для выполнения соответствующего сравнения и помещения результата обратно в стек... это довольно просто, хотя вам может потребоваться настроить логику метода nfx() немного, чтобы проверить такие операторы, как ›=, которые состоят из 2 символов, а не из 1 - person Mark Baker; 18.08.2010
comment
отлично .. только что увидел ваш комментарий .. я уже работал над подобными строками, и он отлично работает .. большое спасибо .. принимая это как правильный ответ .. - person pinaki; 18.08.2010

Я бы сказал, что наиболее подходящим для этого шаблоном будет шаблон спецификации.

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

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

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

person Gordon    schedule 18.08.2010
comment
+1 кажется интересным, не уверен, что смогу его использовать, так как это может потребовать серьезных изменений ... в любом случае спасибо за ответ, я буду его искать и посмотрю, к чему это приведет ... - person pinaki; 18.08.2010