関数の概要
PHPの preg_match_all 関数は、正規表現にマッチするすべての部分文字列を取得するための関数です。文字列の中から指定したパターンに一致する全ての部分を検索し、それらを配列として返します。複数のマッチを一度に取得したい場合に便利です。
パラメータの説明
pattern:検索したい正規表現のパターンを文字列で指定します。デリミタ(例:/)で囲む必要があります。subject:検索対象の文字列を指定します。matches(省略可能):マッチした結果を格納する変数を配列として渡します。マッチした全ての結果がここに保存されます。flags(省略可能):結果の取得方法を変更するフラグです。例えば、PREG_OFFSET_CAPTUREを指定すると、マッチした文字列の開始位置も取得できます。offset(省略可能):検索を開始する位置を指定します。文字列のこの位置から検索が始まります。
戻り値
検索が成功した場合はマッチ数(1以上の整数)が返されます。パターンにマッチする文字列がなければ 0、エラーが発生した場合は false が返されます。
使用例
基本的な使い方
$text = "apple, banana, cherry, apple pie";
preg_match_all("/apple/", $text, $matches);
print_r($matches);
この例では、文字列 $text に含まれる “apple” という文字列をすべて検索しています。結果は $matches 配列に格納され、2回マッチしています。
括弧を使った部分一致の取得
$text = "2023-06-15, 2024-01-10";
preg_match_all("/(d{4})-(d{2})-(d{2})/", $text, $matches);
print_r($matches);
日付のフォーマットにマッチする部分を抽出し、年、月、日ごとに分けて取得します。$matches[0] が全マッチ文字列、$matches[1] が年、$matches[2] が月、$matches[3] が日付の配列になります。
開始位置も一緒に取得する例
$text = "foo123bar456baz789";
preg_match_all("/d+/", $text, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
数字の連続にマッチし、さらに PREG_OFFSET_CAPTURE フラグを使うことで、それぞれの数字が文字列のどの位置にあるかも取得しています。配列の要素は [マッチ文字列, 開始位置] の形式です。
関連する関数
- preg_match — 最初にマッチした部分のみ取得する
- preg_replace — 正規表現による文字列の置換
- preg_split — 正規表現による文字列の分割
- preg_grep — 配列から正規表現にマッチする要素を抽出
まとめ
preg_match_all は、PHPで正規表現を使って複数のマッチを効率的に取得したいときに非常に便利な関数です。マッチした内容を配列で一括管理できるため、特定のパターンを網羅的に処理したい場面で役立ちます。フラグを活用することで取得データの詳細を制御できるため、用途に合わせて使い分けることをおすすめします。
