2010-09-05 95 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