2011-11-09 161 views
11

我的言語都出現文字,如:獲取大括號

This is a {demo} phrase made for {test} 

我需要得到

demo 
test 

注:我的文字可以有{}多個塊,並不總是二。例如:

This is a {demo} phrase made for {test} written in {English} 

我用這個表達/{([^}]*)}/preg_match但它只返回的第一個字,而不是文本中的所有單詞。

回答

13

使用preg_match_all代替:

preg_match_all($pattern, $input, $matches); 

這是大致相同preg_match,下列規定:

subject中搜索在 模式給出的正則表達式的匹配,並把它們放入按標誌指定的順序匹配。

找到第一個匹配後,從上次匹配結束後繼續搜索 。

+0

完美,謝謝 –

2

由於{}是正則表達式匹配語法的一部分,你需要轉義這些字符:

<?php 
$text = <<<EOD 
this {is} some text {from} 
which I {may} want to {extract} 
some words {between} brackets. 
EOD; 
preg_match_all("!\{(\w+)\}!", $text, $matches); 
print_r($matches); 
?> 

產生

Array 
(
    [0] => Array 
     (
      [0] => {is} 
      [1] => {from} 
      [2] => {may} 
      [3] => {extract} 
      [4] => {between} 
     ) 
    ... etc ... 
) 

這個例子可能有助於理解使用正則表達式中的大括號:

<?php 
$str = 'abc212def3456gh34ij'; 
preg_match_all("!\d{3,}!", $str, $matches); 
print_r($matches); 
?> 

它返回:

Array 
(
    [0] => Array 
     (
      [0] => 212 
      [1] => 3456 
     ) 
) 

注意,「34」被從結果中排除,因爲\d{3,}需要匹配至少3個連續位的。

0

使用RegEx匹配一對括號之間的部分,比使用Stack更好。使用正則表達式就像«快速和髒的補丁»,但解析和處理輸入字符串,你必須使用堆棧。對於這個概念,請訪問here,並應用here

8

您的表達是正確的,但您應該使用preg_match_all()代替所有匹配項。這裏是什麼看起來像一個工作示例:

$s = 'This is a {demo} phrase made for {test}'; 

if (preg_match_all('/{([^}]*)}/', $s, $matches)) { 
     echo join("\n", $matches[1]); 
} 

要還捕捉到每場比賽的位置,你可以通過PREG_OFFSET_CAPTURE作爲第四個參數preg_match_all。要使用它,可以使用下面的示例:

if (preg_match_all('/{([^}]*)}/', $s, $matches, PREG_OFFSET_CAPTURE)) { 
     foreach ($matches[1] as $match) { 
      echo "{$match[0]} occurs at position {$match[1]}\n"; 
     } 
}