我在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语句中的条件为false,也是用
测试的if($exp[0])
看起来$exp[0]
看起来像一个字符串,我怎么能把它作为参数进行测试
答案 0 :(得分:2)
$exp[0]
包含10 > 9
(无论您在第一次;
之前拥有什么),所以只有它是空字符串或'0'
才会评估为false。要正确评估这一点,您应该使用eval()
函数:
$condition = '10 > 9';
$result = eval('return ' . $condition . ';');
注意:请勿在生产环境中使用
eval()
,除非您确实确保您的输入无害并且您无法以其他方式执行此操作。
答案 1 :(得分:0)
$exp[0] = (boolean) $exp[0];
可能是您正在寻找的东西
答案 2 :(得分:0)
除非您打算正确地执行此操作(使用解析器),否则最好让用户在多个字段中指定其条件。一行将包含x
的文本字段,比较运算符的选择字段(==
,<
,>
)以及y
的另一个文本字段。然后他们可以指定是否匹配所有支票或任何支票。当它们像这样被打破时,您将能够执行预期的逻辑,而无需使用strpos
和eval
来实现新语言,这完全是疯狂。
您可以在Thunderbird的消息过滤器编辑中看到此类接口的示例:
并在iTune的智能播放列表编辑中: