Анализ или анализ динамического логического выражения в PHP?

Мне нужно оценить пользовательские логические выражения произвольной сложности на некоторых страницах PHP. Предполагая, что поля формы являются первичными переменными, необходимо:

  • заменить «varibles» для значений полей формы;
  • минимально ==, <, <=,> = и> по символу, имени (например, eq, lt, le, ge, gt соответственно);
  • обрабатывать булевы операторы не и, и, возможно, xor по имени, символ (например,!, &&, || и ^^ соответственно);
  • обрабатывать литеральные значения для строк и чисел;
  • быть открытым текстом, а не XML (например, «firstname ==» или lastname == '');
  • быть достаточно результативным.

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

Предложения?

Solutions Collecting From Web of "Анализ или анализ динамического логического выражения в 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 реализованы.