Оценить логическое выражение, данное в PHP как строку? - PullRequest
3 голосов
/ 07 февраля 2012

У меня есть объект, который имеет свойство состояния, например state = 'state4' или state = 'state2' . Теперь у меня также есть массив всех доступных состояний, которые может получить свойство состояния, от state1 до state8 ( примечание: состояния не имеют названия stateN, они имеют 8 разных имен , как платеж или отменен. Я просто поставил stateN, чтобы описать проблему ). В дополнение к этому, у меня есть логическое выражение, например, $ expression =! State1 || state4 && (! State2 || state5) . Это код для приведенного выше описания:

$state = 'state4';
$expression = '!state1||state4&&(!state2||state5)';

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

$state = 'state1';
$expression = state4&&!state2||(!state1||state7);

Какие-нибудь идеи / намеки, как это можно решить элегантным способом?

Спасибо:)

1 Ответ

3 голосов
/ 07 февраля 2012
//Initialize
$state = 'state4';
$expression = '!state1||state4&&(!state2||state5)';

//Adapt to your needs
$pattern='/state\d/';

//Replace
$e=str_replace($state,'true',$expression);
while (preg_match_all($pattern,$e,$matches)
   $e=str_replace($matches[0],'false',$e);

//Eval
eval("\$result=$e;");
echo $result;

Редактировать:

Для обновления OQ требуется небольшая работа:

//Initialize
$state = 'payed';
$expression = '!payed||cancelled&&(!whatever||shipped)';

//Adapt to your needs
$possiblestates=array(
   'payed',
   'cancelled',
   'shipped',
   'whatever'
);

//Replace
$e=str_replace($state,'true',$expression);
$e=str_replace($possiblestates,'false',$e);

//Eval
eval("\$result=$e;");
echo $result;

Редактировать 2

В комментариях было высказано беспокойство по поводу eval и внедрения PHP: выражение и замены полностью контролируются приложением, пользовательский ввод не задействован.Пока это верно, eval безопасно.

...