Как преобразовать строку в логическое значение в php - PullRequest
0 голосов
/ 16 сентября 2011

Я определил эту функцию в php

function ifstatement($statement = 'if(10 > 9;1+1;2+2)') {
// $statement = str_replace(' ', '', $statement);

if (strpos($statement, 'if(') > -1) {
   $statement = rtrim(ltrim(str_replace(' ', '', $statement), 'if('), ')');
   $exp = explode(';', $statement);
  if ( $exp[0] ) {
    if (strpos($exp[1], 'if(' )> -1) {
     return ifstatement($exp[1]);
    } else {
     return 1;
   }
  } else {
  if (strpos($exp[2], 'if(')> -1) {
    return ifstatement($exp[2]);
  } else {
   return 0;
  }
 }
}else{
  echo 'out';
  }
}

проблема в том, что функция всегда возвращает 1, даже если условие в операторе if в аргументе функции ложно, что проверено с

if($exp[0])

похоже, что $exp[0] представляет собой строку, как я могу обойти это, чтобы проверить, как если бы аргумент

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

$exp[0] содержит 10 > 9 (все, что у вас было до первого ;), поэтому он будет оцениваться как ложное только в том случае, если это пустая строка или '0'.Чтобы правильно оценить это, вы должны использовать функцию eval():

$condition = '10 > 9';
$result = eval('return ' . $condition . ';');

Примечание: никогда не используйте eval() в производственной среде, если вы не действительно уверен, что ваш ввод безвреден, и вы не можете сделать это по-другому.

0 голосов
/ 16 сентября 2011

Если вы не собираетесь делать это правильно (с помощью парсера), вам лучше заставить пользователей указывать свои условия в нескольких полях.В одной строке будет текстовое поле для x, поле выбора для оператора сравнения (==, <, >) и другое текстовое поле для y.Затем они могут указать, должны ли совпадать все проверки или какие-либо проверки.Когда они разбиты таким образом, вы сможете выполнить намеченную логику без необходимости реализации нового языка, используя strpos и eval, что является полным безумием.

Вы можете увидеть примерыэтот тип интерфейса при редактировании фильтра сообщений Thunderbird:

enter image description here

и при редактировании интеллектуального плейлиста iTune:

enter image description here

0 голосов
/ 16 сентября 2011
$exp[0] = (boolean) $exp[0];

это, вероятно, то, что вы ищете

...