2010-12-09 41 views
0
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    [{CONTENT:meta}] 
    [{CONTENT:title}] 
    [{CONTENT:head}] 
</head> 

[{CONTENT:open_body}] 

    <p>[{LOCATION:main_1}]</p> 
    <p>[{LOCATION:main_1}]</p> 

</body> 
</html> 

我在$string中有上述"template_file"。我正在嘗試做一個循環遍歷字符串,並且在每次迭代中給我標籤的左側,標籤本身在一個新變量中,然後在另一個字符串中右側。我不能在這裏使用str_replace,因爲我需要在替換它們之前提取標籤內部的內容。將字符串提取(解析)爲片段

類似的輸出將是:

$string_left = everything up to a "[{" 
$command = "CONTENT:meta" 
$string_right= everything after the "}]". 

然後,我會使用CONTENT:meta,然後把東西拿回來一起(string_left + new data + string_right),然後繼續做下去,直到整個事情是分析過程中的數據。

+1

您應該使用現有的模板引擎,而不是自己滾動。 – 2010-12-09 22:38:45

回答

2

你可以用一個比較簡單的正則表達式做到這一點:

$inputString = "left part of string [{inner command}] right part of string"; 


$leftDelim = "\[\{"; 
$rightDelim = "\}\]"; 

preg_match("%(.*?)$leftDelim(.*?)$rightDelim(.*)%is", $inputString, $matches); 

print_r($matches); 

這將演示如何使用正則表達式。在delim變量中額外的斜槓是因爲你的分隔符使用正則表達式字符,所以你需要轉義它們。

1

您可以使用preg_replace與匹配[{...}],具有替代品函數,它匹配的「命令」一起,並返回一個合適的替代字符串中的正則表達式:

$output = preg_replace('/\[{([^}]*)}\]/e', 'my_replacer(\'$1\')', $string); 

,並定義my_replacer爲如下:

function my_replacer($command) { 
    ... 
    return $replacement; 
}