gpt4 book ai didi

javascript - 评估存储为字符串的 bool 条件

转载 作者:行者123 更新时间:2023-12-03 09:32:51 26 4
gpt4 key购买 nike

我的数据库中有数千个从网站上抓取的条目。它们是列出必须满足的条件的字符串。例如:“(事物 1 和事物 2)或(事物 3 和事物 4)”

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

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

我意识到eval()通常是一个坏主意,所以我对其他想法持开放态度。但是,在这种情况下,如果我在运行评估之前仅检查这些字符,并且由于输入是从受信任的站点抓取的数据,我觉得安全性会提高。

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

最佳答案

如果你真的想不惜一切代价避免 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))"));

如果您认为可能存在格式错误的输入,请使用此更安全的版本,如果无法解析表达式,该版本将返回未定义。

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

关于javascript - 评估存储为字符串的 bool 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31444172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com