PHP 验证约束列表

标签 php expression eval

我有一个 < 的数组和 >我从用户那里得到的变量名的限制:

$constraints = array('1<x','x<5','y>4');

在哪里$x$y在相关范围内定义。

我想验证所有约束是否成立(返回 truefalse )

如何在不使用 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));

关于PHP 验证约束列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41192399/

相关文章:

ruby - 替代 eval()

python - eval 导入模块

python - 处理存储在字典中的解析变量

php - 尽管XSL样式表几乎为空,但XSLTProcessor::importStylesheet()中的PHP警告

mysql - 在 R 中用查询替换表达式参数

php - 有没有一种简单的方法可以在命令行中本地设置断点并调试 PHP 脚本?

javascript - 为什么 javascript 中的 slice() 和 substr() 方法对正则表达式不起作用?

php - 创建将匹配字符串中的要求的正则表达式

php - Imagick SVG 无法加载图像

php - Codeigniter XML 数据馈送到多个(MYSQL 表)