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