Динамический анализ логического выражения / оценка в PHP? - PullRequest
10 голосов
/ 29 ноября 2008

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

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

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

Предложения

Ответы [ 6 ]

10 голосов
/ 01 августа 2015

Прошло много времени с тех пор, как был задан этот вопрос, и мне пришлось искать парсер выражений для php. Я решил использовать компонент ExpressionLanguage из Symfony 2.4. Он может быть установлен без каких-либо зависимостей от композитора через packagist .

composer require symfony/expression-language

3 голосов
/ 29 ноября 2008

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

1 голос
/ 29 ноября 2008

Если я правильно понимаю проблему, вы хотите, чтобы пользователи выписывали функции на языке, отличном от PHP, и затем PHP интерпретировал это?

Если это так, вы можете просто взять их строку и заменить "lt" на "<" и "gt" на ">" ... затем выполните eval ().

У меня есть догадка, проблема не так проста, но если это так, eval () может сделать эту работу. Конечно, тогда вы открываете себя для любой атаки.

0 голосов
/ 24 февраля 2013

Вы можете попробовать адаптировать мой класс Evaluator (https://github.com/djfm/Evaluator),, он выполняет арифметические выражения (пока) и вы также можете использовать переменные. Все основные операторы PHP реализованы.

0 голосов
/ 07 апреля 2011

Проверьте эту функцию: http://pluginphp.com/plug-in31.php

0 голосов
/ 06 декабря 2008

Взгляните на пример моего инфикса в постфикс Я думаю, вы можете относительно легко перенести его на PHP. Он использует только массив и некоторые ключи. Нет деревьев. Стек нужен только для запуска результата постфикса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...