注:內容是沒有必要的有效的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