Мне нужно оценить пользовательские логические выражения произвольной сложности на некоторых страницах PHP. Предполагая, что поля формы являются первичными переменными, необходимо:
Теперь, спустя годы, я написал рекурсивные партизаны спуска, которые могли бы построить дерево выражений и делать такие вещи, но это не задача, которую я смахиваю на PHP, поэтому я надеюсь, что там есть вещи, которые, по крайней мере, получат я кое-как туда.
Предложения?
Проверьте create_function , он создает анонимную функцию из переданных параметров строки, я не уверен в ее производительности, но она очень гибкая …
Прошло много времени, так как этот вопрос был задан, и мне пришлось искать парсер выражений для php. Я решил использовать компонент ExpressionLanguage из Symfony 2.4. Он может быть установлен без каких-либо зависимостей от композитора через packagist .
composer require symfony/expression-language
Если я правильно понял проблему, вы хотите, чтобы пользователи записывали функции в не-PHP, а затем интерпретировали PHP?
Если это так, вы можете просто взять свою строку и заменить «lt» на «<» и «gt» на «>» … затем сделать eval ().
У меня есть подозрение, что проблема не такая простая, но если это так, eval () может выполнить эту работу. Конечно, тогда вы открываете себя для любой атаки.
Взгляните на мой инфикс на пример постфикса. Я думаю, вы можете относить его к PHP с относительной легкостью. Он использует только массив и некоторые переключатели. Нет деревьев. Стек необходим только для запуска результата postfix.
Проверьте эту функцию: http://pluginphp.com/plug-in31.php
Вы можете попробовать адаптировать мой класс Evaluator ( https://github.com/djfm/Evaluator ), он выполняет арифметические выражения (пока), и вы также можете использовать переменные. Все основные операторы PHP реализованы.