2010-09-05 97 views
0

我要解析这个模板文件($ HTML):PHP - 解析模板变量与正则表达式

{$myFirstVariable} 
{$myMainVar:MYF1,"x\:x\,x",2:MYF2:MYF3,false} 
{$myLastVariable:trim} 

之后,我的PHP解析器:

$regexp = '#{\$(?<name>.+?)(\:(?<modifiers>.+?))?}#'; 

preg_replace_callback($regexp, 'separateVariable', $html); 

function separateVariable($matches) { 
    $varname = $matches['name']; 

    print $varname."\n"; 

    if (isset($matches['modifiers'])) { 
     $modifiers = $matches['modifiers']; 

     $modifiers = preg_split('#(?<!\\\):#', $modifiers); 
     $parsed = array(); 

     foreach ($modifiers as $modifier) { 
      $modifier = preg_split('#(?<!\\\),#', $modifier); 
      $parsed[array_shift($modifier)] = $modifier; 
     } 

     // parsed[myFuncName] = Array(2ndArg, 3rdArg) 

     print_r($parsed); 
    } 

    print "\n"; 
} 

所有工作,除了我逃脱':'和','在{$ myMainVar:...}中用'\'表示。

你有任何解决方案来解放我'\'?

谢谢。

+1

正则表达式是不是解析语言。放开这样一个想法,即可以通过一个精心制作的正则表达式来实现这一点,而该正则表达式目前正在逃脱你。这是不可能的。编写一个实际的解析器。 – Tomalak 2010-09-05 13:43:23

+0

另请参阅http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2010-09-05 18:22:22

+0

@therefromhere:这个问题不是解析HTML。 – Gumbo 2010-09-06 10:19:46

回答

0

正则表达式不能返回嵌套数组,除了你正试图看起来更像文本处理(substrexplode ..)而不是使用正则表达式。另外,您的示例没有说明输入的标准处理是如何工作的。

我建议:建立一个递归函数,处理unserialiing进程的逻辑,该函数将使用开关情况和string manipulation functions

0

正则表达式不会帮你太多,因为数据有多个层次。将数据首先拆分为:然后解析结果可能会更容易(即现在将substr,1,2拆分为,)。问题是你需要多个Regexes。正则表达式不会返回数组,也不会执行多维匹配;它们用于从提前知道格式的数据中解析字段。

0

如果它可以帮助你:

$string = '{$myVariable:trim:substr,1,2}'; 

if (preg_match("#^\{\\$([a-zA-Z]+)\:([a-z]+)\:([a-z]+)\,([0-9]+)\,([0-9]+)\}$#", $string, $m)){ 
$result = <<<RESULT 
Array (
    "{$m[1]}", 
    Array (
     "{$m[2]}" => Array(), 
     "{$m[3]}" => Array(
      {$m[4]}, 
      {$m[5]} 
     ) 
    ) 
) 
RESULT; 
} 
echo $result; 
+0

感谢上帝我几乎退出了PHP ... :) – 2010-09-05 18:12:36