2012-07-31 50 views
0

我正在嘗試創建自己的代碼以允許客戶在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()

欲解釋像在這種情況下geodeltalinerectanglegeorandomColor此使用的功能。在()之間寫的東西是參數,用;分隔。 (15e3n是在這種情況下,位置「15東,3北」)

實施例: ​​

功能應該被執行,並且應與結果替換功能等這裏:

文本16e13n:3;line(17e13n;19e13n;color:4);15e13n:3應導致16e13n:3;17e13n:4;18e13n:4;19e13n:4;15e13n:3。因爲帶參數17e13n;19e13n;color:4的函數line的結果17e13n:4;18e13n:4;19e13n:4;取代了輸入中的函數。

我該如何做到這一點?什麼是最好的方法?正則表達式? 有關於如何做到這一點的現有例子?

現在,這看起來有點複雜:)

我感謝你提前得到這個幫助!

回答

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 => "") 
) 

然後將它們重新組合成一個結果字符串。

我不會爲你寫一個完整的腳本,但這裏有一個如何處理它的想法。雖然這可能不完整,但通過想一下,你應該能夠完成它。

+0

+1詳細解釋!謝謝;)我將執行到我的代碼。 – ffraenz 2012-07-31 10:00:40