Php 解释一句话;自定义代码“;使用函数

Php 解释一句话;自定义代码“;使用函数,php,api,interpreter,Php,Api,Interpreter,我正在尝试创建一个自己的代码,以允许客户机在服务器上发布一些内容 下面是一个代码示例: 15e3n:3;geo(386299n283752w):4;三角形(16e3n:5;直线(20e0n;20e10n;0e10n;颜色:d);19w55n;矩形(50w50n;高度:100;宽度:50));88e2n:randomColor() 我想用一些函数来解释这一点,比如本例中的geo,delta,line,rectangle,geo,randomColor。在(和)之间写入的内容是参数,用分隔。(15e

我正在尝试创建一个自己的代码,以允许客户机在服务器上发布一些内容

下面是一个代码示例:
15e3n:3;geo(386299n283752w):4;三角形(16e3n:5;直线(20e0n;20e10n;0e10n;颜色:d);19w55n;矩形(50w50n;高度:100;宽度:50));88e2n:randomColor()

我想用一些函数来解释这一点,比如本例中的
geo
delta
line
rectangle
geo
randomColor
。在
之间写入的内容是参数,用
分隔。(
15e3n
在本例中是位置“15东,3北”)

例如:
函数(param1:value1;param2:value2;value3;value4);功能2(参数1:value1)

应执行函数,并用如下结果替换函数:

文本
16e13n:3;线条(17e13n;19e13n;颜色:4);15e13n:3
应导致
16e13n:3;17e13n:4;18e13n:4;19e13n:4;15e13n:3
。因为函数
line
带有参数
17e13n;19e13n;颜色:4
有结果
17e13n:4;18e13n:4;19e13n:4替换输入中的函数

我怎样才能做到这一点?最好的方法是什么?正则表达式? 有没有关于如何做到这一点的现有示例

现在,这看起来有点复杂:)


我提前感谢你在这方面的帮助

注意:内容不是有效PHP脚本所必需的

我的建议是:

5e3n:3;geo(386299n283752w):4;delta(16e3n:5;line(20e0n;20e10n;0e10n;color:d);19w55n;rectangle(50w50n;height:100;width:50));88e2n:randomColor()
首先实现一个解析器,将语句分隔成一个数组。您可以循环每个字符,保持括号计数器并按
拆分位于括号外,生成此数组:

array(
    0 => object(prefix => "5e3n", suffix => "3"),
    1 => object(prefix => "geo(386299n283752w)", suffix => "4"),
    2 => object(prefix => "delta(16e3n:5;line(20e0n;20e10n;0e10n;color:d);19w55n;rectangle(50w50n;height:100;width:50))", suffix => ""),
    3 => object(prefix => "88e2n", suffix => "randomColor()")
)
然后提取函数参数,您可能需要使用对象

array(
    0 => object(prefix => "5e3n", suffix => "3"),
    1 => object(
        prefix => (object)func(
            name => "geo",
            params => array(
                0 => "386299n283752w"
            )
        ),
        suffix => "4"),
    ),
    2 => object(
        prefix => (object)func(
            name => "delta",
            params => array(
                0 => "16e3n:5",
                1 => "line(20e0n;20e10n;0e10n;color:d)",
                2 => "19w55n",
                3 => "rectangle(50w50n;height:100;width:50)"
            )
        ),
        suffix => ""
    ),
    3 => object(
        prefix => "88e2n",
        suffix => (object)func(
            name => "randomColor",
            params => array()
        )
    )
)
递归地执行此操作,直到提取内部的所有函数

然后从深度开始,通过将
(object)func
块替换为结果字符串,通过根据名称执行适当操作的
开关
块来处理函数,例如:

function processFunc($func){
    switch($func->name){
        case "randomColor":
            return selectRandomColor();
        /* ... */
    }
}
将处理此问题:

(object)func(
    name => "randomColor",
    params => array()
)
为此:

"blueColor"
最后,您将得到一个包含以下内容的数组,例如(不直接匹配上面的内容):

然后将它们重新组合成一个结果字符串


我不打算为你写一个完整的脚本,但这里有一个如何处理它的想法。虽然这可能不完整,但仔细想想,您应该能够完成它。

+1详细解释!谢谢;)我将在代码中实现这一点。
array(
    0 => object(prefix => "5e3n", suffix => "3"),
    1 => object(prefix => "6e2n", suffix => "4"),
    2 => object(prefix => "88e2n", suffix => "")
)