Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】PREG_SPLIT_DELIM_CAPTURE定数の使い方

PREG_SPLIT_DELIM_CAPTURE定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

PREG_SPLIT_DELIM_CAPTURE定数は、PHPの正規表現関数preg_splitにおいて、文字列を分割する際に使用される区切り文字を結果の配列に含めるかどうかを制御するための定数を表す定数です。preg_split関数は、指定された正規表現パターンに基づいて文字列を分割し、その結果を配列として返します。通常、preg_split関数で文字列を分割する際、分割に使用された区切り文字は、結果の配列には含まれません。

しかし、このPREG_SPLIT_DELIM_CAPTURE定数をpreg_split関数のオプションとして指定すると、正規表現パターン内で括弧( )によってキャプチャされた区切り文字が、分割された各文字列の間に挿入される形で結果の配列に含まれるようになります。例えば、「リンゴ、バナナ、ミカン」という文字列を正規表現パターン/(,)/(カンマを括弧でキャプチャ)で分割する際にこの定数を使用すると、結果の配列には「リンゴ」、「,」、「バナナ」、「,」、「ミカン」のように、区切り文字そのものも一つの要素として含まれることになります。

この定数を利用することで、分割されたデータだけでなく、そのデータを区切っていた区切り文字自体も情報として取得したい場合に非常に役立ちます。特に、区切り文字が単なるセパレータではなく、何らかの意味を持つトークンとして扱いたい場合に、PREG_SPLIT_DELIM_CAPTUREは強力な機能を提供します。PHP 8の環境で利用可能です。

構文(syntax)

1<?php
2$string = "apple,banana;orange";
3$pattern = "/[,;]/";
4$result = preg_split($pattern, $string, -1, PREG_SPLIT_DELIM_CAPTURE);
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP preg_splitでデリミタをキャプチャする

1<?php
2
3/**
4 * PREG_SPLIT_DELIM_CAPTURE 定数の動作を示すサンプル関数です。
5 *
6 * preg_split 関数でデリミタ (区切り文字) を結果配列に含めるかどうかを比較します。
7 * この定数を使用することで、分割に使用されたデリミタも結果の配列に含めることができます。
8 */
9function demonstratePregSplitDelimCapture(): void
10{
11    // 分割対象となる文字列
12    $subjectString = "apple,banana-orange";
13    // カンマまたはハイフンをデリミタとする正規表現パターン
14    $delimiterPattern = "/[,-]/"; 
15
16    echo "対象文字列: \"{$subjectString}\"\n";
17    echo "デリミタパターン: \"{$delimiterPattern}\"\n\n";
18
19    // --- PREG_SPLIT_DELIM_CAPTURE を使用しない場合 ---
20    echo "--- PREG_SPLIT_DELIM_CAPTURE を使用しない場合 ---\n";
21    // 通常の preg_split はデリミタを除外して文字列を分割します。
22    $resultWithoutCapture = preg_split($delimiterPattern, $subjectString);
23    echo "結果 (デリミタは含まれない):\n";
24    print_r($resultWithoutCapture);
25    echo "\n";
26
27    // --- PREG_SPLIT_DELIM_CAPTURE を使用した場合 ---
28    echo "--- PREG_SPLIT_DELIM_CAPTURE を使用した場合 ---\n";
29    // PREG_SPLIT_DELIM_CAPTURE を指定すると、
30    // 分割に使用されたデリミタ自体も結果の配列要素として含まれます。
31    // 第3引数には -1 を指定し、分割の制限をなくしています。
32    $resultWithCapture = preg_split($delimiterPattern, $subjectString, -1, PREG_SPLIT_DELIM_CAPTURE);
33    echo "結果 (デリミタも含まれる):\n";
34    print_r($resultWithCapture);
35    echo "\n";
36}
37
38// 関数を実行して動作を確認します
39demonstratePregSplitDelimCapture();
40
41?>

PHPのPREG_SPLIT_DELIM_CAPTUREは、PHP 8で利用できる定数の一つで、文字列を正規表現で分割するpreg_split関数で使用されます。この定数を指定すると、文字列の分割に使われた区切り文字(デリミタ)そのものも、分割結果の配列に含めるかどうかを制御できます。定数であるため、引数や戻り値はありません。

サンプルコードでは、「apple,banana-orange」という文字列を、「,」(カンマ)または「-」(ハイフン)をデリミタとして分割する例を通して、この定数の動作を示しています。

まず、PREG_SPLIT_DELIM_CAPTUREを使用しない場合です。通常のpreg_split関数では、指定したデリミタで文字列を分割すると、デリミタ自体は結果の配列には含まれません。そのため、結果は「apple」「banana」「orange」という要素を持つ配列となります。

次に、preg_split関数の最後の引数にPREG_SPLIT_DELIM_CAPTURE定数を指定した場合です。この定数を追加すると、分割に使用されたデリミタである「,」と「-」も、結果の配列に要素として含まれます。この場合の結果は、「apple」「,」「banana」「-」「orange」という順序の配列となります。なお、preg_split関数の第3引数には、分割の制限がないことを示す-1を指定しています。

このようにPREG_SPLIT_DELIM_CAPTURE定数を使用することで、文字列を分割する際に、どのデリミタがどこで使われたかの情報も同時に取得できるようになります。

PREG_SPLIT_DELIM_CAPTUREは、preg_split関数で文字列を分割する際、分割に使用されたデリミタ(区切り文字)自体も結果の配列に含めるための定数です。この定数を使う際は、preg_split関数の第三引数であるlimitに-1を指定し、分割回数に制限を設けないのが一般的です。limitに他の値を指定すると、意図しない分割結果となる可能性があるため、注意してください。デリミタが結果配列に含まれることで、配列の要素数や順序が変わりますので、その後の配列操作では、デリミタの位置を考慮する必要があります。正規表現のパターンを正確に指定することが重要です。

PHP preg_split で区切り文字をキャプチャする

1<?php
2
3/**
4 * PREG_SPLIT_DELIM_CAPTURE フラグの動作を示すサンプル関数です。
5 * preg_split 関数が区切り文字をキャプチャして結果に含めるかどうかを比較します。
6 */
7function demonstratePregSplitDelimCapture(): void
8{
9    $text = "apple,banana;orange";
10    // コンマ(,)またはセミコロン(;)を区切り文字とし、それらをキャプチャグループとする正規表現
11    $pattern = '/([,;])/';
12
13    echo "--- PREG_SPLIT_DELIM_CAPTURE フラグなしの場合 ---" . PHP_EOL;
14    // PREG_SPLIT_DELIM_CAPTURE フラグなしの場合、区切り文字は結果に含まれない
15    $resultWithoutFlag = preg_split($pattern, $text);
16    echo "入力文字列: \"" . $text . "\"" . PHP_EOL;
17    echo "正規表現: \"" . $pattern . "\"" . PHP_EOL;
18    echo "結果: " . print_r($resultWithoutFlag, true) . PHP_EOL;
19
20    echo "--- PREG_SPLIT_DELIM_CAPTURE フラグありの場合 ---" . PHP_EOL;
21    // PREG_SPLIT_DELIM_CAPTURE フラグありの場合、キャプチャされた区切り文字も結果配列に含まれる
22    $resultWithFlag = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE);
23    echo "入力文字列: \"" . $text . "\"" . PHP_EOL;
24    echo "正規表現: \"" . $pattern . "\"" . PHP_EOL;
25    echo "結果: " . print_r($resultWithFlag, true) . PHP_EOL;
26}
27
28// 関数の実行
29demonstratePregSplitDelimCapture();
30
31?>

PHPのPREG_SPLIT_DELIM_CAPTUREは、preg_split関数と組み合わせて使用される定数です。preg_split関数は、指定された正規表現パターンを区切り文字として文字列を分割し、その結果を配列として返します。この定数自体には引数や戻り値はありません。

PREG_SPLIT_DELIM_CAPTUREフラグを使用しない場合、preg_split関数は文字列を区切る際に使用した文字を結果の配列には含めません。サンプルコードの最初の例では、"apple,banana;orange"という文字列をカンマ(,)やセミコロン(;)で分割していますが、結果の配列には"apple", "banana", "orange"のみが含まれ、区切り文字自体は除外されています。

一方、PREG_SPLIT_DELIM_CAPTUREフラグをpreg_split関数の第4引数に指定すると、正規表現パターンで「キャプチャグループ」(括弧()で囲まれた部分)として指定された区切り文字も、分割された要素として結果の配列に含められます。サンプルコードの2つ目の例では、カンマやセミコロンがキャプチャグループとして指定されているため、結果の配列には"apple", ",", "banana", ";", "orange"のように、区切り文字も順番に含めて出力されます。このフラグを使うことで、区切り文字の情報も維持したまま文字列を分割できます。

PREG_SPLIT_DELIM_CAPTUREフラグは、preg_split関数で文字列を分割する際に、正規表現でキャプチャグループとして定義した区切り文字も結果配列に含めるために使用します。初心者が注意すべき最も重要な点は、区切り文字自体を単にパターンに含めるだけでなく、必ず正規表現の括弧 () で囲み、「キャプチャグループ」として定義する必要があることです。これがないと、フラグを指定しても区切り文字は結果に含まれません。

また、このフラグはpreg_split関数の第四引数に指定するため、第三引数に分割上限(limit)を-1のように必ず指定する必要があります。引数の順序を間違えないよう注意してください。結果の配列は、分割された文字列とキャプチャされた区切り文字が交互に格納されるため、その後の処理では配列の構造を正しく理解して利用することが不可欠です。

関連コンテンツ