2013-01-09 99 views
0

我正在處理包含特殊標誌形式爲「{X}」或「{XX}」的文本數據,其中X可以是任何字母數字字符。當這些標記相鄰或分開時,將爲這些標記指定特殊含義。我需要一個正則表達式來匹配相鄰的標誌並分隔組中的每個標誌。與preg_match_all匹配的嵌套模式(正則表達式和PHP)

對於實施例,給出下面的輸入:

{B}{R}: Target player loses 1 life. 
{W}{G}{U}: Target player gains 5 life. 

輸出應該近似:

("{B}{R}", 
"{W}{G}{U}") 

("{B}", 
"{R}") 

("{W}", 
"{G}", 
"{U}") 

我的PHP代碼被適當地返回鄰道陣列,但分割陣列僅包含最後每組匹配標記:

$input = '{B}{R}: Target player loses 1 life. 
{W}{G}{U}: Target player gains 5 life.'; 
$pattern = '#((\{[a-zA-Z0-9]{1,2}})+)#'; 
preg_match_all($pattern, $input, $results); 
print_r($results); 

輸出:

Array 
(
    [0] => Array 
     (
      [0] => {B}{R} 
      [1] => {W}{G}{U} 
     ) 

    [1] => Array 
     (
      [0] => {B}{R} 
      [1] => {W}{G}{U} 
     ) 

    [2] => Array 
     (
      [0] => {R} 
      [1] => {U} 
     ) 

) 

感謝您的幫助!

+3

這裏沒有實際的嵌套,只是重複。除非我誤解,否則你只是想分解每個令牌。然後刪除'+'和外部parens,讓'preg_match_all'每個單獨返回。 //當然,如果您想在輸入流文本中找到出現的內容,請使用原始方法,並在第二次運行中重新處理它。用一個PCRE調用分解它是不可行的,缺少指定一組有限的可選標記發生'(\ {\ w})?(\ {\ w})?(\ {\ w})?'。 – mario

+0

那麼我想分出每個組「{B} {R}」和「{W} {G} {U}」。我還想在單獨的數組中分別標出每個標誌「{B}」,「{R}」,「{W}」,「{G}」和「{U}」。我想唯一的辦法是運行兩個正則表達式。 – skibulk

回答

0
unset($results[1]); 
foreach($results[0] AS $match){ 
    preg_match_all('/\{[a-zA-Z0-9]{1,2}}/', $match, $r); 
    $results[] = $r[0]; 
} 

這是我知道創建所需數據結構的唯一方法。雖然,preg_split也可以工作:

unset($results[1]); 
foreach($results[0] AS $match) 
    $results[] = preg_split('/(?<=})(?=\{)/', $match);