eval是一个允许程序员从代码中的字符串变量执行以相同语言编写的任意代码的函数。
我想做相当于: 对象结果 = Eval("1 + 3"); string now = Eval("System.DateTime.Now().ToString()") 作为字符串 按照 Biri 的链接,我得到了这个片段(修改为删除
我正在尝试将列中的字符串转换为公式,并根据我指定的值输出结果。例如: 组合<- c("FE56", "FE58", "FE61", "YI6...
Playwright locator.evaluateAll 如何返回使用节点 forEach 填充的对象数组
更新见下文 我想获取所有 节点的属性和 类型或 类型的节点子节点的 innerText 简化版...
在 JavaScript 程序中重构动态加载的脚本以避免 eval
这可能是一个特定的问题(研究项目),但我正在寻找一种使该程序比目前“更安全”的好方法。 目标是接受任意
我想从字符串计算数学表达式。我已经读到解决这个问题的方法是使用 eval()。但是当我尝试运行以下代码时: 我想从字符串计算数学表达式。我已经读到解决这个问题的方法是使用 eval()。但是当我尝试运行以下代码时: <?php $ma ="2+10"; $p = eval($ma); print $p; ?> 它给了我以下错误: 解析错误:语法错误,意外的$end in C:\xampp\htdocs clipseWorkspaceWebDev\MandatoryHandinSite ester.php(4) :第 1 行的 eval() 代码 有人知道这个问题的解决方案吗 虽然我不建议为此使用eval(不是解决方案),但问题是eval需要完整的代码行,而不仅仅是片段。 $ma ="2+10"; $p = eval('return '.$ma.';'); print $p; 应该做你想做的事。 更好的解决方案是为您的数学表达式编写分词器/解析器。这是一个非常简单的基于正则表达式的示例: $ma = "2+10"; if(preg_match('/(\d+)(?:\s*)([\+\-\*\/])(?:\s*)(\d+)/', $ma, $matches) !== FALSE){ $operator = $matches[2]; switch($operator){ case '+': $p = $matches[1] + $matches[3]; break; case '-': $p = $matches[1] - $matches[3]; break; case '*': $p = $matches[1] * $matches[3]; break; case '/': $p = $matches[1] / $matches[3]; break; } echo $p; } 看看这个.. 我在会计系统中使用它,您可以在其中在金额输入字段中编写数学表达式.. 例子 $Cal = new Field_calculate(); $result = $Cal->calculate('5+7'); // 12 $result = $Cal->calculate('(5+9)*5'); // 70 $result = $Cal->calculate('(10.2+0.5*(2-0.4))*2+(2.1*4)'); // 30.4 代码 class Field_calculate { const PATTERN = '/(?:\-?\d+(?:\.?\d+)?[\+\-\*\/])+\-?\d+(?:\.?\d+)?/'; const PARENTHESIS_DEPTH = 10; public function calculate($input){ if(strpos($input, '+') != null || strpos($input, '-') != null || strpos($input, '/') != null || strpos($input, '*') != null){ // Remove white spaces and invalid math chars $input = str_replace(',', '.', $input); $input = preg_replace('[^0-9\.\+\-\*\/\(\)]', '', $input); // Calculate each of the parenthesis from the top $i = 0; while(strpos($input, '(') || strpos($input, ')')){ $input = preg_replace_callback('/\(([^\(\)]+)\)/', 'self::callback', $input); $i++; if($i > self::PARENTHESIS_DEPTH){ break; } } // Calculate the result if(preg_match(self::PATTERN, $input, $match)){ return $this->compute($match[0]); } // To handle the special case of expressions surrounded by global parenthesis like "(1+1)" if(is_numeric($input)){ return $input; } return 0; } return $input; } private function compute($input){ $compute = create_function('', 'return '.$input.';'); return 0 + $compute(); } private function callback($input){ if(is_numeric($input[1])){ return $input[1]; } elseif(preg_match(self::PATTERN, $input[1], $match)){ return $this->compute($match[0]); } return 0; } } 我最近创建了一个 PHP 包,它提供了一个 math_eval 辅助函数。它完全可以满足您的需求,而无需使用可能不安全的eval功能。 只需传入数学表达式的字符串版本,它就会返回结果。 $two = math_eval('1 + 1'); $three = math_eval('5 - 2'); $ten = math_eval('2 * 5'); $four = math_eval('8 / 2'); 你也可以传入变量,如果需要的话将被替换。 $ten = math_eval('a + b', ['a' => 7, 'b' => 3]); $fifteen = math_eval('x * y', ['x' => 3, 'y' => 5]); 链接:https://github.com/langleyfoxall/math_eval 当您无法控制字符串参数时,使用 eval 函数是非常危险的。 尝试 Matex 进行安全的数学公式计算。 解决了! <?php function evalmath($equation) { $result = 0; // sanitize imput $equation = preg_replace("/[^a-z0-9+\-.*\/()%]/","",$equation); // convert alphabet to $variabel $equation = preg_replace("/([a-z])+/i", "\$$0", $equation); // convert percentages to decimal $equation = preg_replace("/([+-])([0-9]{1})(%)/","*(1\$1.0\$2)",$equation); $equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation); $equation = preg_replace("/([0-9]{1})(%)/",".0\$1",$equation); $equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation); if ( $equation != "" ){ $result = @eval("return " . $equation . ";" ); } if ($result == null) { throw new Exception("Unable to calculate equation"); } echo $result; // return $equation; } $a = 2; $b = 3; $c = 5; $f1 = "a*b+c"; $f1 = str_replace("a", $a, $f1); $f1 = str_replace("b", $b, $f1); $f1 = str_replace("c", $c, $f1); evalmath($f1); /*if ( $equation != "" ){ $result = @eval("return " . $equation . ";" ); } if ($result == null) { throw new Exception("Unable to calculate equation"); } echo $result;*/ ?> 这种方法有两个主要缺点: 安全性,php脚本正在被eval函数评估。这不好, 特别是当用户想要注入恶意代码时。 复杂性 我创建了这个,检查一下:Formula Interpreter 它是如何工作的? 首先,使用公式及其参数创建FormulaInterpreter的实例 $formulaInterpreter = new FormulaInterpreter("x + y", ["x" => 10, "y" => 20]); 用execute()方法解释公式。它将返回结果: echo $formulaInterpreter->execute(); 在一行中 echo (new FormulaInterpreter("x + y", ["x" => 10, "y" => 20]))->execute(); 例子 # Formula: speed = distance / time $speed = (new FormulaInterpreter("distance/time", ["distance" => 338, "time" => 5]))->execute() ; echo $speed; #Venezuela night overtime (ordinary_work_day in hours): (normal_salary * days_in_a_work_month)/ordinary_work_day $parameters = ["normal_salary" => 21000, "days_in_a_work_month" => 30, "ordinary_work_day" => 8]; $venezuelaLOTTTArt118NightOvertime = (new FormulaInterpreter("(normal_salary/days_in_a_work_month)/ordinary_work_day", $parameters))->execute(); echo $venezuelaLOTTTArt118NightOvertime; #cicle area $cicleArea = (new FormulaInterpreter("3.1416*(radio*radio)", ["radio" => 10]))->execute(); echo $cicleArea; 关于公式 它必须至少包含两个操作数和一个运算符。 Operands的名称可以是大写或小写。 到目前为止,数学函数如 sin、cos、pow……不包括在内。我正在努力将它们包括在内。 如果您的公式无效,您将收到如下错误消息:错误,您的公式(single_variable)无效。 参数的值必须是数字。 如果你愿意,你可以改进它! 在 eval 的危险和无限的计算可能性之间找到最佳平衡点我建议只检查数字、运算符和括号的输入: if (preg_match('/^[0-9\+\-\*\/\(\)\.]+$/', $mathString)) { $value = eval('return ' . $mathString . ';'); } else { throw new \Exception('Invalid calc() value: ' . $mathString); } 还是比较好用,比较省事。它可以处理任何基本的数学计算,如(10*(1+0,2)),这对于此处提到的大多数解决方案都是不可能的。 eval 将给定代码评估为 PHP。这意味着它将把给定的参数作为一段 PHP 代码执行。 要更正您的代码,请使用: $ma ="print (2+10);"; eval($ma); 使用评估函数 protected function getStringArthmeticOperation($value, $deduct) { if($value > 0){ $operator = '-'; }else{ $operator = '+'; } $mathStr = '$value $operator $deduct'; eval("\$mathStr = \"$mathStr\";"); $userAvailableUl = eval('return '.$mathStr.';'); return $userAvailableUl; } $this->getStringArthmeticOperation(3, 1); //2 eval'd 表达式应该以“;”结尾 试试这个: $ma ="2+10;"; $p = eval($ma); print $p; 顺便说一句,这超出了范围,但“eval”函数不会返回表达式的值。 eval('2+10') 不会返回 12。 如果你想让它返回 12,你应该 eval('return 2+10;');
我正在尝试在 R Markdown 中创建一个 flexdashboard,它在单击操作按钮时运行特定的代码块。 IE。在仪表板的开头,会出现一个带有单选按钮的问卷,w ...
我的练习是调用 hack 函数,只需返回“你被黑了!”在控制台上,通过使用 hack3.txt 文件而不修改代码,有什么想法吗?下面的代码: 导入操作系统 来自
我已经阅读了 Stack Overflow 上的所有内容,因为无法找到答案。关于这个主题的帖子也有好几年了,所以我希望有更新。 问题:你如何引用一个...
我已经通过 pytorch 训练了一个模型,并且该模型在训练期间在训练、验证和测试集上表现良好,但是当我读取保存的模型参数以在那里可视化测试集时...
input="a b '1 2 3' c" arr=($输入); printf '%s|' “${arr[@]}” # 打印:a|b|'1|2|3'|c| 评估“arr=($输入)”; printf '%s|' “${arr[@]}” # 打印:a|b|1 2 3|c| ...
TypeError:只能在我使用 eval() 时连接 str
所以我遇到了这个错误: 打印(评估(溶胶)) 文件“”,第 1 行,在 类型错误:只能将 str(不是“int”)连接到 str 使用此代码: 用户输入...
为什么我不能通过在 JavaScript/Node.js 的无限循环中动态创建全局范围的变量来耗尽堆?
我想一遍又一遍地创建全局变量,直到我的计算机的堆没有更多空间,然后出现错误。我认为以下代码可以做到这一点: 对于(让 i = 0;真;i++){ ……
在 Node.js 中(如果你想知道:v16.15.0): 我想一遍又一遍地创建全局变量,直到我的计算机的堆栈/堆没有更多空间,并且出现错误。我以为下面的代码会......
Ruby 能保证 eval(str.inspect) == str 吗?
我最近发现自己需要根据用户输入生成一个简单的 Ruby 脚本,其中一些需要作为字符串文字包含在脚本中。虽然在我的具体情况下,这个输入来了
isinstance(“我的字符串”,“str | int”) isinstance("我的字符串", "列表") 有没有办法检查变量的类型(在这种情况下是“我的字符串”)bas ...
目前正在开发一个“简单”的模板类,问题是如何在不使用 eval 的情况下在字符串中执行 PHP 代码? 以下示例是我的模板类的工作方式: $用户=...
我正在尝试创建一个 PHP“编辑器”,因此,我有一个带有 PHP 编辑器的表单和一个处理作为输入提交并作为对象返回的代码的文件。 为了抓一些...
我的团队正在从 Clickhouse 迁移到 Azure Data Explorer (ADX)。我们目前在从 ADX 查询数据时遇到困难:查询的值是正确的,但数据被读取为 ...
中断 console.log 调用的方法并将其替换为 React 中的另一个函数
我正在寻找一种方法来中断 React 中的 console.log 并在使用 eval() 时用另一个功能替换它 但是 React/Nextjs 有 use strict 计划构建一个 codepen 替代方案,但它