【PHP8.x】preg_split関数の使い方

作成日: 更新日:

preg_split関数は、正規表現を使用して文字列を分割し、その結果を配列として返す関数です。この関数は、指定された正規表現パターンに一致する部分を区切り文字として扱い、対象の文字列を複数の要素に分割します。

基本的な使い方は、最初の引数に分割の基準となる正規表現パターンを、次の引数に分割したい対象の文字列を指定します。関数は、分割された各部分文字列を含む配列を返します。例えば、文字列中の複数の空白文字や、カンマとセミコロンのような異なる記号を区切り文字として一度に指定し、文字列を効率的に分割したい場合に非常に役立ちます。

PHPのexplode関数も文字列を分割しますが、preg_split関数は区切り文字に正規表現を利用できるため、より複雑で柔軟なパターンマッチングに基づいて文字列を分割できる点が大きな特徴です。これにより、「数字ではない文字」や「特定の文字の繰り返し」といった動的なパターンで文字列を分割することが可能になります。

さらに、この関数にはオプションの引数も用意されています。limit引数を使用すると、分割する要素の最大数を指定できます。また、flags引数を使用することで、空の要素を結果から除外したり、分割された文字列だけでなくそのオフセット(元の文字列内での開始位置)も同時に取得したりするなど、関数の動作を細かく制御できます。

このようにpreg_split関数は、データ整形やテキスト解析など、様々な状況で複雑な文字列の分割処理が必要となる際に非常に強力なツールとして活用できます。

基本的な使い方

構文(syntax)

<?php

$string = "apple,banana,orange";
$pattern = '/,/';
$result = preg_split($pattern, $string);

print_r($result);

?>

引数(parameters)

string $pattern, string $subject, int $limit = -1, int $flags = 0

  • string $pattern: 区切り文字として使用する正規表現パターン
  • string $subject: 分割対象の文字列
  • int $limit = -1: 取得する配列の最大要素数(デフォルトは全要素)
  • int $flags = 0: 分割方法を指定するフラグ

戻り値(return)

array|false

文字列を正規表現パターンで分割した結果を配列で返します。分割に失敗した場合は false を返します。

サンプルコード

PHP preg_split 関数の使い方を学ぶ

<?php

// preg_split関数の使用例
// この関数は、正規表現(パターン)に基づいて文字列を分割し、結果を配列として返します。
// システムエンジニアを目指す初心者の方でも理解しやすいように、基本的な使い方を説明します。

// 分割対象となる文字列を定義します。
$subject = "apple, banana orange  grape";

// --- 例1: 最も基本的な使い方 ---
// カンマ (,) またはスペース ( ) で文字列を分割します。
// パターン '/[, ]/' は「カンマ、またはスペース」のいずれか1文字にマッチします。
$pattern1 = '/[, ]/';
$result1 = preg_split($pattern1, $subject);

echo "--- 例1: カンマまたはスペースで分割 ---\n";
echo "元の文字列: \"$subject\"\n";
print_r($result1);
echo "\n";

// --- 例2: 空の要素を除外する (PREG_SPLIT_NO_EMPTY フラグ) ---
// 元の文字列に区切り文字が連続している場合(例: "apple,,banana" や "orange  grape")、
// デフォルトでは空の要素が結果の配列に含まれることがあります。
// PREG_SPLIT_NO_EMPTY フラグを使用すると、これらの空の要素を除外できます。
// パターン '/[, ]+/' は「1つ以上のカンマ、またはスペース」にマッチします。
$subject2 = "apple,,banana orange  grape";
$pattern2 = '/[, ]+/';
$result2 = preg_split($pattern2, $subject2, -1, PREG_SPLIT_NO_EMPTY);

echo "--- 例2: PREG_SPLIT_NO_EMPTY フラグで空の要素を除外 ---\n";
echo "元の文字列: \"$subject2\"\n";
print_r($result2);
echo "\n";

// --- 例3: 分割数を制限する (limit 引数) ---
// limit 引数を使うと、生成される配列の要素数を最大で指定した数に制限できます。
// 指定した数に達すると、残りの文字列は分割されず最後の要素として含まれます。
// ここでは、最初の2つの区切り文字で分割し、最大3つの要素を生成します。
$subject3 = "one,two,three,four,five";
$pattern3 = '/,/';
$limit = 3; // 生成される要素の最大数を3に設定
$result3 = preg_split($pattern3, $subject3, $limit);

echo "--- 例3: limit 引数で分割数を制限 ---\n";
echo "元の文字列: \"$subject3\"\n";
echo "limit = $limit\n";
print_r($result3);
echo "\n";

?>

preg_split関数は、指定した正規表現パターンに基づいて文字列を分割し、その結果を配列として返すPHPの関数です。システムエンジニアとして、文字列データを特定の区切り文字で分解して処理する際に非常に役立ちます。

この関数は、まず第一引数に「どのような区切りで分割するか」を示す正規表現パターン $pattern を指定します。次に、第二引数 $subject に「分割したい元の文字列」を渡します。関数が成功すると、分割された各部分文字列が要素として格納された配列が返されます。もし分割に失敗した場合はfalseが返されます。

例えば、サンプルコードの例1のように、カンマまたはスペースといった複数の区切り文字で文字列を分割する際に利用できます。

さらに、オプション引数を使用することで、より細かな制御が可能です。第三引数 $limit を指定すると、生成される配列の最大要素数を制限できます。例えば、3を指定すれば、最大で3つの要素が配列に格納され、残りの文字列は分割されずに最後の要素の一部として扱われます。例3では、この$limit引数を用いて分割数を制限しています。

また、第四引数 $flags には、分割の挙動を調整するための定数を渡します。特にPREG_SPLIT_NO_EMPTYフラグはよく利用され、区切り文字が連続する場合などに発生する空の要素を結果の配列から自動的に除外することができます。例2では、このフラグを使用することで、連続するカンマやスペースによって生じる空要素が配列に含まれないようにしています。

preg_split関数は正規表現(パターン)に基づいて文字列を分割します。最も重要な点は、パターンとして指定する正規表現の記述方法を正しく理解することです。例えば、.*などの正規表現の特殊文字を区切り文字として扱いたい場合は、\.のようにバックスラッシュでエスケープする必要があります。

また、区切り文字が連続する場合や文字列の先頭・末尾に区切り文字がある場合、デフォルトでは空の要素が結果の配列に含まれることがあります。これを避けるには、第4引数にPREG_SPLIT_NO_EMPTYフラグを指定してください。

第3引数のlimitで分割数を制限すると、指定した要素数に達した時点で残りの文字列は分割されず、最後の要素として配列に格納されます。関数が失敗した場合はfalseを返しますので、実行結果が期待通りか常に確認するようにしてください。

PHP preg_splitで空白区切り文字列を分割する

<?php

/**
 * 文字列を1つ以上の空白文字で分割する関数。
 *
 * @param string $text 分割対象の文字列
 * @return array 分割された文字列の配列
 */
function splitStringByWhitespace(string $text): array
{
    // preg_split 関数を使用して、文字列を正規表現で指定されたパターンで分割します。
    // /\s+/ は正規表現で、以下を意味します。
    // \s : 任意の空白文字(スペース、タブ、改行など)にマッチします。
    // +  : 直前の要素(ここでは \s)が1回以上繰り返されることにマッチします。
    // このパターンにより、連続する複数の空白も1つの区切りとして扱われ、
    // 分割結果に空の要素が含まれるのを防ぎます。
    $parts = preg_split('/\s+/', $text);

    // 分割された文字列の配列を返します。
    return $parts;
}

// --------------------------------------------------
// 以下は関数を実際に使用するサンプルコードです。
// --------------------------------------------------

// 分割したい文字列を定義します。
$myString = "  Hello    World   PHP   Programming  ";

// 上記の関数を呼び出して文字列を空白で分割します。
$result = splitStringByWhitespace($myString);

// 分割結果を出力して確認します。
echo "元の文字列: '" . $myString . "'\n";
echo "分割結果:\n";
print_r($result);

echo "\n"; // 見やすいように改行

// 別の文字列で試してみます。
$anotherString = "  Learning PHP is fun ";
$anotherResult = splitStringByWhitespace($anotherString);

echo "別の元の文字列: '" . $anotherString . "'\n";
echo "別の分割結果:\n";
print_r($anotherResult);

?>

PHPのpreg_split関数は、指定された正規表現のパターンに基づいて文字列を分割し、その結果を配列として返す非常に便利な関数です。このサンプルコードでは、preg_split関数を使って、文字列を「1つ以上の空白文字」で分割する方法を示しています。

splitStringByWhitespace関数内で使用されているpreg_split('/\s+/', $text)という部分がその核心です。ここで/\s+/は正規表現のパターンを表します。\sは「任意の空白文字」(半角スペース、タブ、改行など)にマッチし、+は「直前の要素が1回以上繰り返される」ことを意味します。これにより、連続する複数の空白文字も1つの区切りとして扱われ、結果の配列に不要な空の要素が含まれるのを防ぐことができます。

preg_split関数の引数としては、第一引数に正規表現パターン(string $pattern)を、第二引数に分割したい対象の文字列(string $subject)を指定します。この関数の戻り値は、分割された部分文字列を格納した配列(array)となります。もし分割に失敗した場合はfalseが返されることがあります。

サンプルコードはまずsplitStringByWhitespaceという関数を定義し、その中でpreg_splitを利用しています。その後、いくつかの文字列に対してこの関数を適用し、どのように文字列が空白で分割され、結果が配列として出力されるかを確認できます。これにより、文字列処理の一般的なタスクである空白による分割を効率的に行う方法が理解できます。

このサンプルコードでは、正規表現/\s+/を使用して文字列を分割しています。\sはあらゆる空白文字に、+はそれが1回以上繰り返されることを意味するため、連続する複数の空白文字を一つの区切りとして扱います。この+があることで、分割結果に空の要素が含まれるのを防いでいますが、もし+がない/\s/のように記述すると、連続する空白文字の間にも空の要素が生成されるため注意が必要です。preg_split関数は、正規表現パターンにマッチする区切りが見つからない場合や、正規表現自体に構文エラーがある場合にfalseを返すことがあります。実際のシステムでは、この戻り値がfalseでないかを確認し、適切なエラーハンドリングを行うことが重要です。また、この関数にはlimit引数で分割する要素の最大数を、flags引数で追加のオプション(例えばPREG_SPLIT_NO_EMPTYを指定して空の要素を自動で除外するなど)を設定できますので、状況に応じて利用を検討してください。

【PHP8.x】preg_split関数の使い方 | いっしー@Webエンジニア