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