为运行用户脚本在PHP中解析语言。
我的应用程序需要对一些数据进行一些数学运算。由于这些操作经常会发生变化,我想使用一种解释性语言,让用户自己编写。
我发现 PHP 有 LUA 和一种 JS 解析器,然而文档非常不好。
是否有任何解释性语言可以从 PHP 解析?我只需要基本的 if-then-else 和数学运算符。
即使没有太多的文档,我会选择使用 LUA,并使用此处找到的安装脚本https://github.com/chtombleson/php-lua-install-script
其他支持的语言列在这里http://pecl.php.net/packages.php?catpid=59&catname=Languages。
我知道回应有点晚了,但……
处理可定制的用户逻辑并且找不到一个易于使用的现成解决方案,这正是我决定只创建了一个自己的脚本语言,叫做 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。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
如果你想为你的用户提供绝对最简单的方法...在用户输入方程式之后,你将负责在随后的页面上利用方程式...那么你可以进行字符串解析。
因此,例如,你会在字符串中找到所有文本字符,然后将它们转换为输入。所以,对于方程式"2x",你会创建一个单一的输入:
2<input name='x' />,然后,在提交后,你将2x转换为:$result = floatval(2) * floatval($_GET['x']);只要你不相信方程式和用户输入的代码,确保正确的类型等,则这样做相当安全。然而,根据你的经验,正确解析字符串并将2y转换为2*y等将是你的挑战,更多的我无法在短时间内回答。
MathML的重点在于,如果你能将用户的方程式转换为MathML,则可以利用其他人处理方程式的工作。我的评论的重点不是让用户自己利用MathML...那是你的工作 :)