preg_match_all

(PHP 3 >= 3.0.9, PHP 4, PHP 5)

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

説明

int preg_match_all ( string pattern, string subject, array &matches [, int flags [, int offset]] )

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

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

flagsは、以下のフラグの組み合わせとなります。 (PREG_PATTERN_ORDERPREG_SET_ORDERと組み合わせて使用することは無意 味であることに注意してください。)

PREG_PATTERN_ORDER

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

<?php
preg_match_all
("|<[^>]+>(.*)</[^>]+>|U",
    
"<b>example: </b><div align=left>this is a test</div>",
    
$out, PREG_PATTERN_ORDER);
echo
$out[0][0] . ", " . $out[0][1] . "\n";
echo
$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]は二番目にマッチした組の配列であり、 といった順序となります。

<?php
preg_match_all
("|<[^>]+>(.*)</[^>]+>|U",
    
"<b>example: </b><div align=\"left\">this is a test</div>",
    
$out, PREG_SET_ORDER);
echo
$out[0][0] . ", " . $out[0][1] . "\n";
echo
$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]は二番目にマッチした 組といったようになります。

PREG_OFFSET_CAPTURE

このフラグが設定された場合、マッチする度に付随する文字列のオフ セットも返されます。これにより、返り値は配列となり、その各要素 はマッチした文字列を要素0subjectの中でのその文字列オフセットを要 素1とする配列となることに注意してください。 このフラグは、PHP 4.3.0 以降で利用可能です。

flagsが指定されない場合、 PREG_PATTERN_ORDERが指定されたことを仮定します。

通常、探索は対象文字列の先頭から開始されます。 オプションのパラメータoffsetは、検索の開始を始める 場所として別の位置を指定するために使用けいます。 offsetパラメータは、 PHP 4.3.3以降で使用可能です。

注意: offset は、 substr($subject, $offset)preg_match_all()の対象文字列の場所に指定するのと 等価ではありません。 これは、pattern には、 ^, $ または (?<=x)のようなアサーションを含めることができる ためです。この例については、 preg_match() を参照してください。

パターンがマッチした総数(ゼロとなる可能性もあります)を返します。ま たは、マッチしなかったか、エラーが発生した場合にFALSEを返します。

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

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

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

<?php
// \\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()も参照ください。