preg_match_all

(PHP 3 = 3.0.9, PHP 4 )

preg_match_all -- グローバル正規表現検索を行う

説明

int preg_match_all ( string pattern, string subject, array matches, int [order] )

subject において pattern で指定した正規表現にマッチする かどうかを検索し、 order で指定した 順番で matches に結果を代入します。

最初にマッチするものが見つかった後、最後にマッチしたパターンの後から 検索が続行されます。

order は、次の2つのどちらかとなります。

PREG_PATTERN_ORDER

$matches[0] がパターン全体にマッチする配列であり、 $matches[1] が最初の括弧で括られたサブパターンにマッチする 文字列の配列であり、といった順番となります。

preg_match_all ("| [^ ]+ (.*) /[^ ]+ |U", 
    " b example:  /b  div align=left this a test /div ", 
    $out, PREG_PATTERN_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n";
この例の出力は以下のようになります。
 b example:  /b ,  div align=left this is a test /div 
example: , this is a test
$out[0]は、パターン全体にマッチする文字列の配列を有しており、 $out[1]は、タグで囲まれた文字列の配列を有しています。

PREG_SET_ORDER

$matches[0]は最初にマッチした組の配列であり、 $matches[1]は二番目にマッチした組の配列であり、 といった順序となります。

preg_match_all ("| [^ ]+ (.*) /[^ ]+ |U",
    " b example:  /b  div align=left this a test /div ", 
    $out, PREG_SET_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n";
この例の出力は以下のようになります。
 b example:  /b , example: 
 div align=left this is a test /div , this is a test
この場合、$matches[0] は最初にマッチした組であり、 $matches[0][0] はパターン全体にマッチしたテキスト、 $matches[0][1] は最初のサブパターンにマッチしたテキスト、 といったようになります。 同様に、$matches[1]は二番目にマッチした組といったようになり ます。



order が指定されない場合、PREG_PATTERN_ORDER を仮定します。

パターンがマッチした総数を返します。または、マッチしなかったか、 エラーが発生した場合に FALSE を返します。

例 1テキストから全ての電話番号を得る

preg_match_all ("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] )
\d{3}-\d{4}/x",
               "Call 555-1212 or 1-800-555-1212", $phones);


例 2HTMLタグにマッチするものを見付ける(greedy)

// \\2 は後方参照の例です。これは、pcre に正規表現自体の括弧の2番目の
// 組、つまりこの場合は([\w]+)、にマッチします。文字列が二重引用符で括
// られているため、バックスラッシュの追加が必要です。
$html = " b bold text /b  a href=howdy.html click me /a ";

preg_match_all ("/( ([\w]+)[^ ]* )(.*)( \/\\2 )/", $html,
$matches);

for ($i=0; $i  count($matches[0]); $i++) {
  echo "matched: ".$matches[0][$i]."\n";
  echo "part 1: ".$matches[1][$i]."\n";
  echo "part 2: ".$matches[3][$i]."\n";
  echo "part 3: ".$matches[4][$i]."\n\n";
}
この例の出力は以下となります。
matched:  b bold text /b 
part 1:  b 
part 2: bold text
part 3:  /b 

matched:  a href=howdy.html click me /a 
part 1:  a href=howdy.html 
part 2: click me
part 3:  /a 


preg_match() , preg_replace() , preg_split() も参照下さい。