注:内容是没有必要的有效的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详细解释!谢谢;)我将执行到我的代码。 – ffraenz 2012-07-31 10:00:40