PHP将字符串解析为条件运算符

时间:2014-03-06 07:49:47

标签: php

我有一个表单,用户可以在其中创建自己的条件。 E.g

<select name="operator">
    <option value="==">(==) Equal</option>
    <option value="!=">(!=) - Not Equal</option>
    <option value="&gt;">(&gt;) - Greater than</option>
    <option value="&lt;">(&lt;) - Less than</option>
    <option value="&gt;=">(&gt;=) - Greater than or equal to </option>
    <option value="&lt;=">(&lt;=) - Less than or equal to </option>
</select>

我如何解析运算符以使其实际上是一个字符串但php将其解释为条件运算符?

if($column $operator $value){

}

这样做的长篇大论将是这样的:

switch($operator){
    case '!=':
        if($column != $value){

        }
    break;
    case '<=':
    case '&lt;=':
        if($column <= $value){

        }
    break;
}

2 个答案:

答案 0 :(得分:3)

执行此操作的唯一方法是使用eval将字符串计算为PHP代码。

出于安全原因,通常不建议使用eval。使用switch的当前方法是最佳解决方案。唯一的另一种选择是以类似的方式使用if语句。

答案 1 :(得分:1)

间接答案

虽然PHP支持执行任意代码,但我建议你来执行它。有其他选择!

对于这种情况,我会建议Strategy Pattern。它是一种允许在运行时选择行为的模式。恕我直言,你需要什么。

设置可能比switch语句要多一些,但它更灵活,更易于维护。

直接回答

您可以使用eval()php.net):

if (eval("return \$column $operator \$value;")) {
}

但我强烈不鼓励你这样做:

  

eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。

我无法表达这一点:不要使用eval()