为运行用户脚本在PHP中解析语言。

我的应用程序需要对一些数据进行一些数学运算。由于这些操作经常会发生变化,我想使用一种解释性语言,让用户自己编写。

我发现 PHP 有 LUA 和一种 JS 解析器,然而文档非常不好。

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

点赞
用户3339337
用户3339337

如果你想为你的用户提供绝对最简单的方法...在用户输入方程式之后,你将负责在随后的页面上利用方程式...那么你可以进行字符串解析。

因此,例如,你会在字符串中找到所有文本字符,然后将它们转换为输入。所以,对于方程式"2x",你会创建一个单一的输入:2<input name='x' />,然后,在提交后,你将2x转换为:

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

只要你不相信方程式和用户输入的代码,确保正确的类型等,则这样做相当安全。然而,根据你的经验,正确解析字符串并将2y转换为2*y等将是你的挑战,更多的我无法在短时间内回答。

MathML的重点在于,如果你能将用户的方程式转换为MathML,则可以利用其他人处理方程式的工作。我的评论的重点不是让用户自己利用MathML...那是你的工作 :)

2015-03-02 19:03:56
用户2633161
用户2633161

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

其他支持的语言列在这里http://pecl.php.net/packages.php?catpid=59&catname=Languages

2015-03-03 08:56:51
用户1285669
用户1285669

我知道回应有点晚了,但……

处理可定制的用户逻辑并且找不到一个易于使用的现成解决方案,这正是我决定只创建了一个自己的脚本语言,叫做 Primi 的原因。

纯 PHP 编写,由 PHP 单独运行并解释。没有依赖于某些外部二进制文件或者库,或者任何花哨的,非标准的 PHP 扩展。

我的意思是,phpv8/v8js 相当不错(看起来他们在过去的 2 年里做了很多工作),但是让它工作起来对我来说相当困难,至少在我当时在研究现有脚本解决方案的时候(当时我对 Linux 知之甚少)。下载和编译 Google 的 V8,配置并编译扩展,最后让它工作起来——如果你没有绝对控制你的机器(云托管等),有时甚至都不是一个选项。

Primi 可以做什么?

Primi 肯定不如 PHP、JS、Python 等成熟脚本语言在功能和性能上表现得那么出色,它的目的不是做一些复杂的事情,如(面向对象编程、支持类、异步处理等),而是提供一个简单的方式,让开发者允许他/她的客户写自定义逻辑(运算、条件、循环、字符串操作等),这些逻辑可以在 Primi 的解释器中被安全地执行,而 Primi 的解释器本身是由 PHP 执行的,因此受限于 PHP 的虚拟机。

而且,所有这些都不需要对周围环境进行任何更改(比如在整个操作系统上安装二进制文件、编译库)。

安装

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

composer require smuuf/primi

安装过程就这样了。

用法

可以像这样使用解释器:

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

try {

    // 让解释器运行源代码。
    $interpreter->run('a = 1; b = a + 2; c = "some string"; d = c + " extra thing";');

    // 从主上下文中获取定义的变量并打印它们。
    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

免责声明

我是这个的作者。

如果您发现任何 bug 需要报告、有新功能建议、想看看它是如何工作的或者想帮助,可以在这里找到一切:https://github.com/smuuf/primi

2018-01-07 02:37:11