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

时间:2015-03-02 16:55:27

标签: javascript php lua

我的应用程序需要对某些数据进行一些数学运算。由于theese操作会经常发生变化,我正在考虑使用解释语言并让用户编写它们。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我知道回复这个问题有点晚了,但是......

处理可自定义的用户逻辑而不是找到一个简单易用的解决方案,这就是为什么我继续前进并创建我自己的脚本语言Primi 的确切原因

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

我的意思是,phpv8/v8js非常棒(看起来他们在过去的两年里做了很多工作),但获取它-work 部分对我来说非常粗糙 - 至少当时我正在研究现有的脚本解决方案(当时我对Linux的知识有限)。下载并编译Google的V8,配置编译扩展,然后最终使其工作 - 如果您对机器没有绝对控制权,那么有时甚至不是选项 em>(云托管和东西)。

Primi可以做什么?

Primi绝对是非常非常低劣任何完整的脚本/编程语言,如PHP,JS,Python等等。 - 无论是功能还是性能(它都是_is_解释通过PHP)

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

所有这些都没有对周围环境进行任何更改(操作系统范围内安装二进制文件,编译库)

安装

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->getPhpValue());
    }

} 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

答案 2 :(得分:0)

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

如果你想为你的用户提供绝对最简单的方法......用户输入一个等式然后你有责任在后续页面上使用这个等式......那么你就可以进行字符串解析。

因此,例如,您可以在字符串中找到所有文本字符并将其转换为输入。因此,使用等式&#34; 2x&#34;,您将创建一个输入:2<input name='x' />然后,在帖子上,您将2x转换为:

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

这样的东西是非常安全的,只要你不相信方程式或用户输入的PHP代码......确保正确的类型等等。但是,根据你的经验,正确解析字符串并转向2y进入2 * y等等,这将是你的挑战,并且超过我能给出的时间。

MathML上的一点是,如果您可以使用用户公式并将其转换为MathML,您可以利用其他人的工作来处理方程式。我的评论中的要点不是让用户自己使用MathML ......这是你的工作:)