2014-01-13 69 views
0

我有一個PHP文件中的模板標籤,我似乎無法與正則表達式匹配。其實,我以前用過的東西我已經做過,但這次我不能使用它。所有的模板標籤都會看起來像這樣:{$EXAMPLE},一個美元符號周圍的兩個縮寫,後面跟着任何東西。實際上,例子這個詞總是大寫,可能包含下劃線或短劃線,但這部分並不是必須的。我已經是這樣的:php正則表達式匹配模板標籤

模板文件:

{$HEADER} 
{$MENU} 
{$BODY} 
{$FOOTER} 

PHP文件:

$template = file_get_contents(TEMPLATE); 
preg_match_all('^{$.*}^U', $template, $matches); 
var_dump($matches); 

其中var_dump輸出空數組。

+2

什麼awfu你在那裏選擇了'^'[分隔符](http://www.php.net/manual/en/regexp.reference.delimiters.php)? ...問題是,你沒有逃避'$'。它是正則表達式中的[metacharcter](http://www.regular-expressions.info/characters.html):用於結束行/字符串的錨點。爲了匹配文字'$',它必須被轉義爲'\ $'。 –

回答

1

由於大括號和美元符號是meta-characters,需要用反斜槓轉義。將您的正則表達式從^{$.*}^U更改爲^\\{\\$.*\\}^U,您的代碼將完美工作。

+0

也可以,謝謝 – user1205600

+0

不客氣。 – 2014-01-13 16:14:25

+0

感謝你的解釋方式 – user1205600

1

試試這個:

$template = file_get_contents(TEMPLATE); 
preg_match_all('/^(\{\$.*\})^U/', $template, $matches); 
var_dump($matches); 

見現場演示這裏:http://rubular.com/r/52kKX0dIdl

+0

,謝謝你,第一個工作答案我要說的是解決方案 – user1205600

+0

@ user1205600:你應該接受一個答案,如果工作 –

1

您可以使用此:

preg_match_all('~{\$[^}]+}~', $template, $matches); // negated character class + greedy quantifier 

preg_match_all('~{\$[A-Z_-]+}~', $template, $matches); // follows your description