我正在尝试创建一个自己的代码,以允许客户在pixel matrix上发布内容。
这是一个代码示例:
15e3n:3;geo(386299n283752w):4;delta(16e3n:5;line(20e0n;20e10n;0e10n;color:d);19w55n;rectangle(50w50n;height:100;width:50));88e2n:randomColor()
我想使用像geo
,delta
,line
,rectangle
,geo
,randomColor
这样的函数来解释这一点。在(
和)
之间写入的内容是参数,以;
分隔。 (15e3n
在这种情况下是“15 east,3 north”)
实施例:
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;
替换了输入中的函数。
我怎样才能做到这一点?什么是最好的方法?正则表达式? 是否有关于如何执行此操作的示例?
现在,这看起来有点复杂:)
我提前感谢您的帮助!
答案 0 :(得分: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 => "")
)
然后在最后你会得到一个内容的单个数组,例如(不直接匹配上面):
{{1}}
然后将它们重新组合成一个结果字符串。
我不打算为你写一个完整的脚本,但是这里有一个如何处理它的想法。虽然这可能不完整,但通过思考,你应该能够完成它。