PHP入門 正規表現関数 すべてのマッチ文字列を取得する(preg_match_all関数)

すべてのマッチ文字列を取得する場合は、preg_match_all関数を利用します。preg_match関数は一度の実行で1つの実行結果しか返しません。対象の文字列に複数のマッチ文字列があったも、結果には最初の1つしか出力しないので、すべてのマッチ文字列を取得するには、preg_match_all関数を利用します。

構文:preg_match_all関数

preg_match_all(string $pattern, string $subject
                 [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset]]]):int|false
$pattern正規表現パターン
$subject検索対象の文字列
&$matches検索結果を格納する配列
$flags動作フラグ
$offset検索の開始位置(既定では文字列の先頭)

例:

引数$flagsに定数PREG_SETORDER(マッチ順)を指定した場合、preg_match_all関数は、以下の図のような多次元配列を返します。

図

最初にマッチした文字列の情報は配列$dataの最初の要素に、次にマッチした文字列情報は次の要素に・・・と、マッチしたかたまりごとに配列が生成されます。

<?php
$str='会社の電話番号は0399-99-1123、私のは0388-22-1234です。郵便番号は666-1105です';
if(preg_match_all('/([0-9]{2,4})-([0-9]{2,4})-([0-9]{4})/',$str,$data,PREG_SET_ORDER)){
  foreach($data as $item){
    print "電話番号:{$item[0]}<br />";
    print "市外局番:{$item[1]}<br />";
    print "市内局番:{$item[2]}<br />";
    print "加入者番号:{$item[3]}<hr />";
  }
}
実行結果
実行結果

引数$flagsにPREG_PATTERN_ORDER(パターン順)を指定した場合、または省略した場合には、以下の図のような配列が生成されます。パターン全体、サブマッチパターンと、パターンの単位それぞれのマッチング結果がまとめられます。

図
引数$flagsには、preg_match関数と同様、定数PREG_OFFSET_CAPTURE(オフセット値を取得)を指定できます。PREG_OFFSET_CAPTUREは「PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE」のように、他の定数との組み合わせを指定します。