$constraints = array('1<x','x<5','y>4');
其中$x和$y在相关范围内定义.
我想验证所有约束是否成立(返回true或false)
如何在不使用eval的情况下执行此操作?
解决方法:
我在这里编造了一个部分答案.它不循环,但它支持五个不同的比较运算符.
function lt($p1, $p2) {
return ($p1 < $p2);
}
function le($p1, $p2) {
return ($p1 <= $p2);
}
function gt($p1, $p2) {
return ($p1 > $p2);
}
function ge($p1, $p2) {
return ($p1 >= $p2);
}
function eq($p1, $pw) {
return ($p1 == $p2);
}
function apply_rule($rule, $x, $y) {
$matches = NULL;
if (!preg_match('/^([a-zA-Z0-9]+)(<|>|=|<=|>=)([a-zA-Z0-9]+)$/', $rule, $matches)) {
throw new Exception("Invalid rule: " . $rule);
}
//var_dump($matches);
$p1 = $matches[1];
$operator = $matches[2];
$p2 = $matches[3];
// check if first param is a variable
if (preg_match('/([a-zA-Z]+)/', $p1)) {
$p1 = $$p1;
}
// check if second param is a variable
if (preg_match('/([a-zA-Z]+)/', $p2)) {
$p2 = $$p2;
}
switch($operator) {
case "<":
return lt($p1, $p2);
case "<=":
return le($p1, $p2);
case ">":
return gt($p1, $p2);
case ">=":
return ge($p1, $p2);
case "=":
return eq($p1, $p2);
}
}
var_dump(apply_rule("x>=10", 10, 20));