0

我正在尝试创建自己的代码以允许客户端在像素矩阵上发布某些内容。

这是一个代码示例: 15e3n:3;geo(386299n283752w):4;delta(16e3n:5;line(20e0n;20e10n;0e10n;color:d);19w55n;rectangle(50w50n;height:100;width:50));88e2n:randomColor()

我想使用这种情况下的函数来解释这一点geodelta, line, rectangle, geo, randomColor(写在和之间的东西是)参数,用 隔开;。(15e3n在这种情况下是位置“东 15,北 3”)

例子: function(param1:value1;param2:value2;value3;value4);function2(param1:value1)

这些函数应该被执行并且应该用下面的结果替换函数:

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

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

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

我提前感谢您在这方面获得帮助!

4

1 回答 1

2

注意:内容不是必需的有效 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为结果字符串来处理函数switch,例如:

function processFunc($func){
    switch($func->name){
        case "randomColor":
            return selectRandomColor();
        /* ... */
    }
}

将处理这个:

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

进入这个:

"blueColor"

然后最后你会得到一个数组,其中的内容,例如(不直接匹配上面):

array(
    0 => object(prefix => "5e3n", suffix => "3"),
    1 => object(prefix => "6e2n", suffix => "4"),
    2 => object(prefix => "88e2n", suffix => "")
)

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

我不会为你写一个完整的脚本,但这里有一个关于如何处理它的想法。虽然这可能不完整,但通过思考你应该能够完成它。

于 2012-07-31T08:49:30.300 回答