PHP 内用于 运行 用户脚本的解释语言

Intepreted language inside PHP for running user scripts

我的应用程序需要对某些数据进行一些数学运算。由于这些操作会经常变化,所以我想用解释性语言让用户写。

我看到 PHP 有 LUA 和一种 JS 解析器,但是文档很差。

是否有任何可以从PHP解析的解释语言?我只需要基本的 if-then-else 和数学运算符

我可能会对此发表评论,但它有点太长了,从技术上讲它几乎是一个答案:-p

如果您希望为您的用户提供绝对最简单的方法...用户输入方程式然​​后您负责在后续页面上使用该方程式...那么您可以进行字符串解析。

因此,例如,您将找到一个字符串中的所有文本字符并将它们转换为输入。因此,使用等式“2x”,您将创建一个输入:2<input name='x' /> 然后,在 post 上,您将 2x 转换为:

$result = floatval(2) * floatval($_GET['x']);

只要您既不信任方程式也不信任用户输入的 PHP 代码,这样的事情是非常安全的...确保正确的类型等。但是,根据您的经验,解析正确输入字符串并将 2y 转换为 2 * y 等,这将是您的挑战,我无法在给定时间内回答。

MathML 的要点是,如果您可以获取用户的方程式并将其转换为 MathML,您就可以利用其他人的工作来处理方程式。我评论的重点不是让用户自己使用 MathML……那是你的工作:)

即使没有太多文档,我也会选择 LUA,使用此处找到的安装脚本 https://github.com/chtombleson/php-lua-install-script

此处列出了支持的其他语言http://pecl.php.net/packages.php?catpid=59&catname=Languages

我知道现在回复这个有点晚了,但是...

处理可自定义的用户逻辑而没有找到一个简单、随时可用的解决方案,这正是我继续前进并 创建我自己的脚本语言 Primi 的确切原因.

纯粹用 PHP 编写,在 PHP 中进行沙盒化和解释。完成时不依赖于某些外部二进制文件 and/or 库,或任何花哨的非标准 PHP 扩展。

我的意思是,phpv8/v8js is pretty great (and looks like they've done a lot of work in the last 2 years), but the getting-it-to-work part was pretty rough for me - at least at the time, when I was doing my research about existing scripting solutions (and with my limited knowledge of Linux stuff back then). Downloading and compiling Google's V8,配置一个编译扩展,然后最终让它工作 - 这 有时甚至不是一个选项,如果你不这样做对您的机器有绝对的控制权 (云托管和东西).

Primi 能做什么?

Primi 绝对 非常、非常不如 任何完全承诺的 scripting/programming 语言,如 PHP、JS、Python 等. - 按功能和性能(_is_ 解释为 PHP)

Primi 的目标不是做复杂的事情 - 拥有 OOP,支持 类,异步的东西或诸如此类的东西 (至少现在不是) - 而是为了为开发人员提供一种简单的方法,允许his/her客户编写自定义逻辑 (计算、条件、循环,字符串操作等) 可以在 Primi 的解释器中 安全执行 ,它本身由 PHP 执行,因此被限制在 PHP 内自己的虚拟机。

并且所有这些都没有对周围环境做任何改变(OS全范围安装二进制文件,编译库).

安装

Primi 可以作为 Composer package 安装,然后立即使用:

composer require smuuf/primi

安装过程到此为止。

用法

解释器可以这样使用:

$context = new \Smuuf\Primi\Context;
$interpreter = new \Smuuf\Primi\Interpreter($context);

try {

    // Let the interpreter run a source code.
    $interpreter->run('a = 1; b = a + 2; c = "some string"; d = c + " extra thing";');

    // Get defined variables from primary context and print them.
    foreach ($context->getVariables() as $name => $value) {
        printf("%s (%s) ... %s\n", $name, $value::TYPE, $value->getInternalValue());
    }

} catch (\Smuuf\Primi\ErrorException $e) {
    die($e->getMessage());
}

运行 PHP 中的代码将导致:

a (number) ... 1
b (number) ... 3
c (string) ... some string
d (string) ... some string extra thing

免责声明

我是这篇文章的作者

如果您发现任何错误要报告,对新功能有建议,或者您只是想看看它是如何工作的或想提供帮助,您可以在这里找到其他所有内容:https://github.com/smuuf/primi.