2011-11-09 15 views
11

中括弧の間の単語の出現をすべて取得したテキストのように:{}の複数のブロックを持つことができます私のテキスト、常にではない:私は私が持っている

demo 
test 

注意を取得する必要があります

This is a {demo} phrase made for {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と同じです: パターンで指定した正規表現に一致するすべての対象と

検索し、それらを置きますflagsで指定された順序で一致します。

最初の一致が見つかった後、後続の検索は最後の一致の最後から に続きます。

+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); 
?> 
は、少なくとも3の連続する数字の一致を必要とするので、「34」が結果から除外されていることを

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

注:返し

0

RegExを使用した中括弧の間の部分の一致は、この目的のためにスタックを使用するよりも劣ります。 RegExを使用すると、「素早く汚れたパッチ」のようになりますが、入力文字列の解析と処理にはスタックを使用する必要があります。コンセプトはhere、適用するにはhereをご覧ください。

8

あなたの式は正しいですが、代わりにpreg_match_all()を使用して、すべて一致するを検索する必要があります。 preg_match_all第4のパラメータとして

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

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

また、各試合の位置をキャプチャするには、あなたが渡すことができPREG_OFFSET_CAPTURE:ここではそれがどのように見えるかの作業例です。これを使用するには、次の例を使用します。

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