PHP验证约束列表

我有一个<和>我从用户那里得到的变量名约束:

$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));

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...