注意:内容不是必需的有效 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 => "")
)
然后将它们重新组合成一个结果字符串。
我不会为你写一个完整的脚本,但这里有一个关于如何处理它的想法。虽然这可能不完整,但通过思考你应该能够完成它。