评估存储为字符串

时间:2015-07-16 01:58:51

标签: javascript php string boolean-expression

我在数据库中有数千个从网站上删除的条目。它们是列出必须满足条件的字符串。例如:"(Thing1 and Thing2) or (Thing3 and Thing4)"

我希望用户输入他们拥有的条件列表,然后根据数据库进行检查。由于这些字符串来自可信站点,并且非常接近有效的布尔条件,因此我很想将它们放在eval()语句中。我可以解析字符串,找到条件,检查它们是否为真,并用1或0替换它们。然后用(&&,||)替换(和,或)。然后我会检查以确保那一点上的所有内容都是:space,1,0,&,|,(或)。如果没有,请以某种方式记录错误。如果只是那些角色:

eval("Boolean((1 && 0) || (0 && 0))")

我意识到eval()通常是一个坏主意,所以我对其他想法持开放态度。但是,在这种情况下,如果我在运行eval之前检查这些字符,并且输入是从可信站点中删除的数据,我觉得安全性会增加。

我计划在javascript中执行此操作,但也可以在服务器上的PHP中执行此操作。

1 个答案:

答案 0 :(得分:1)

如果您真的想不惜一切代价避免使用eval(),可以使用以下内容:



function evalBoolean(str) {
    while (str.length > 1) {
        str = str.replace(/0 && 0|0 && 1|1 && 0|0 \|\| 0|\(0\)/g, "0");
        str = str.replace(/1 && 1|0 \|\| 1|1 \|\| 0|1 \|\| 1|\(1\)/g, "1");
    }
    return (str == "1");
}

alert(evalBoolean("((0 && 1) || (1 && 1))"));
alert(evalBoolean("(((0 || 1) && (0 || 0)) && ((1 || 1) || 0))"));




如果您认为输入格式错误,请使用此更安全的版本,如果无法解析表达式,则返回undefined。



function evalBoolean(str) {
    var len;
    while (str.length > 1) {
        if (str.length == len) return; else len = str.length;
        str = str.replace(/0\s*&&\s*0|0\s*&&\s*1|1\s*&&\s*0|0\s*\|\|\s*0|\(\s*0\s*\)|\s*0\s*/g, "0");
        str = str.replace(/1\s*&&\s*1|0\s*\|\|\s*1|1\s*\|\|\s*0|1\s*\|\|\s*1|\(\s*1\s*\)|\s*1\s*/g, "1");
    }
    return (str == "1");
}

alert(evalBoolean(" (( (0|| 1)  &&(0 || 0) )&& (  (1||1) ||0))"));
alert(evalBoolean("((1 && 0) && 1 )) ( && 1"));




相关问题