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」のように、他の定数との組み合わせを指定します。