《PHP8上級試験対策》preg_split()で文字列を正規表現分割する仕組みを理解しよう

  • URLをコピーしました!

はじめに

PHPの preg_split() は、正規表現パターンにマッチした箇所で文字列を分割する関数です。
一見すると単なる explode() の上位互換のように思われがちですが、「マッチした部分そのものは結果に含まれない」という仕様が、試験でもよく問われるポイント。
本記事では、実際のコード例をもとに、分割結果がどのように導かれるのかを丁寧に解説します。

キーワード:preg_split / 正規表現 / 文字列分割 / PREG_SPLIT_DELIM_CAPTURE /

目次

🧠preg_split()の基本構文

preg_split(
    string $pattern,
    string $subject,
    int $limit = -1,
    int $flags = 0
): array|false
  • $pattern : 分割の基準となる正規表現
  • $subject : 分割対象の文字列
  • $limit : 分割数の上限(省略可)
  • $flags : オプション(マッチ部分も結果に含めるなど)

📘例題コード

<?php
declare(strict_types=1);
error_reporting(-1);

$pattern = '/[0-9]{2}/'; // 2桁の数字にマッチ
$r = preg_split($pattern, 'a12b3c45d');
var_dump($r);

■ 実行結果

array(3) {
  [0] => string(1) "a"
  [1] => string(3) "b3c"
  [2] => string(1) "d"
}

💬なぜこの結果になるのか?

ポイントは、/[0-9]{2}/「連続する2桁の数字」 にマッチするという点。
対象文字列 'a12b3c45d' のうち、

  • 12
  • 45
    がマッチ対象になります。

preg_split() は、マッチした箇所を「切れ目」として文字列を分割します。
したがって下のような分割が行われます。

a12b3c45d
  ↑   ↑
  • マッチの前 → "a"
  • マッチとマッチの間 → "b3c"
  • 最後のマッチ後 → "d"

結果として、配列 ["a", "b3c", "d"] が返ります。

✅ この挙動は 正しい です。

🏷️ マッチ部分も結果に含めたい場合

もし「マッチした文字列(12 や 45)も結果に含めたい」場合は、
PREG_SPLIT_DELIM_CAPTURE フラグを追加します。

$r = preg_split($pattern, 'a12b3c45d', -1, PREG_SPLIT_DELIM_CAPTURE);
var_dump($r);

結果:

array(5) {
  [0] => "a"
  [1] => "12"
  [2] => "b3c"
  [3] => "45"
  [4] => "d"
}

explode() にはない柔軟な動きをする点が、preg_split() の強みです。

🧩図解:preg_split()の分割イメージ

対象文字列:a12b3c45d
正規表現 :[0-9]{2}

分割イメージ:
a |12| b3c |45| d
↓
["a", "b3c", "d"]

🧾まとめ

項目内容
関数名preg_split()
機能正規表現にマッチした部分で文字列を分割する
マッチ部分結果には含まれない(除外される)
フラグで変更可能PREG_SPLIT_DELIM_CAPTURE を指定すると含められる
試験での注意点explode() との違い・マッチ結果の扱い

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次