jcubic/expression

安全评估数学、字符串和布尔表达式

2.0.0 2024-01-06 18:46 UTC

This package is auto-updated.

Last update: 2024-09-27 16:23:34 UTC


README

Expression.php - safely evaluate math, string, and boolean expressions

安全评估数学、字符串和布尔表达式

Latest Stable Version CI Total Downloads License

描述

当您想从不受信任的来源评估数学或布尔表达式时,请使用 Expression 类。您可以在对象中定义自己的变量和函数。

特性

  • 整数和浮点数
  • 数学表达式:* / - + %^**
  • 布尔表达式:&&||!
  • 比较:> < == != <= >=
  • 严格比较 ===!==
  • pie 常量
  • 正则表达式和匹配操作符 =~
  • 字符串字面量
  • JSON 对象和数组
  • 对象和数组上的方括号操作
  • 位移操作符 >> <<
  • 等号操作符在数组和对象上生效
  • 函数和变量

安装

composer require jcubic/expression

使用方法

<?

require_once(__DIR__ . "/vendor/autoload.php");
use jcubic\Expression;

$e = new Expression();
// basic evaluation:
$result = $e->evaluate('2+2');
// supports: order of operation; parentheses; negation; built-in functions
$result = $e->evaluate('-8(5/2)^2*(1-sqrt(4))-8');
// support of booleans
$result = $e->evaluate('10 < 20 || 20 > 30 && 10 == 10');
// support for strings and match (regexes can be like in php or like in javascript)
$result = $e->evaluate('"Foo,Bar" =~ /^([fo]+),(bar)$/i');
// previous call will create $0 for whole match match and $1,$2 for groups
$result = $e->evaluate('$2');
// create your own variables
$e->evaluate('a = e^(ln(pi))');
// or functions
$e->evaluate('f(x,y) = x^2 + y^2 - 2x*y + 1');
// and then use them
$result = $e->evaluate('3*f(42,a)');
// create external functions
$e->functions['foo'] = function() {
  return "foo";
};
// and use them
$result = $e->evaluate('foo()');

方法

  • $e->evalute($expr)

评估表达式并返回结果。如果发生错误,则打印警告并返回 false。如果 $expr 是函数分配,则成功时返回 true。

  • $e->e($expr)

$e->evaluate() 的同义词。

  • $e->vars()

返回一个关联数组,包含所有用户定义的变量和值。

  • $e->funcs()

返回一个包含所有用户定义函数的数组。

参数

  • $e->suppress_errors

设置为 true 以在评估表达式时关闭警告

  • $e->last_error

如果上次评估失败,包含描述错误的字符串。(当 suppress_errors 打开时很有用)。

  • $e->functions

包含外部定义函数的关联数组。

  • $e->variables

包含用户定义和外部定义变量的关联数组。

历史

此项目最初是一个分支。原始代码由 Miles Kaufmann 创建,并在 PHPClasses.org 上发布。我在原始代码中添加了许多功能和错误修复,但后来决定代码很难修改以添加新功能和修复错误。因此,我决定从头开始使用 PEG 解析器生成器重写一切。

原始代码仍可在 packagist 上的版本 1.0 上找到,源代码可在 遗产分支 中找到。

致谢

许可证

版权 (c) 2024 Jakub T. Jankiewicz
MIT 许可下发布