定義と使い方
- PHPバージョン
- 4+
preg_split()関数は、文字列を指定した正規表現パターンを基準に分割し、配列へ変換して返す関数です。このとき、元の文字列は変更されません。
この関数は、特に正規表現を活用した文字列の分割やURL解析などの処理で便利に使用されます。
基本例
/* 指定した文字列から、正規表現を使用して数字と文字を分割する例 */
$string = 'Hello123';
$parts_string = preg_split('/(?<=\D)(?=\d)|(?<=\d)(?=\D)/', $string); // 数字と文字を分割
// 指定した正規表現パターンの基準は、「文字から数字へ変わる境界」または「数字から文字へ変わる境界」です。
print_r($parts_string);
/* 出力:
Array (
[0] => Hello
[1] => 123
)
*/
echo '文字 : ' . $parts_string[0]; // 出力: '文字 : Hello';
echo '数字 : ' . $parts_string[1]; // 出力: '数字 : 123';
/* URLからプロトコルの種類を分割する簡単な例 */
$url = "https://www.example.com/path/to/resource";
$parts_url = preg_split('#://#', $url);
print_r($parts_url);
/* 出力:
Array (
[0] => https
[1] => www.example.com/path/to/resource
)
*/
echo 'プロトコルの種類: ' . $parts_url[0]; // 出力: 'プロトコルの種類: https'
もう一度確認してください!
正規表現パターンの強力な機能が必要なく、単純な文字列を基準に指定した文字列を分割するだけであれば、explode()関数やstr_split()関数を使用するほうが、シンプルでパフォーマンス面でも高速です。
構文
preg_split(
string $pattern,
string $subject,
int $limit = -1,
int $flags = 0
): array|false
/* preg_split(
正規表現パターン,
分割対象となる文字列[,
最大で分割できる要素数[,
追加設定を指定するフラグ]]
);
*/
引数
$pattern |
必須。分割時に使用する正規表現パターンです。 |
|---|---|
$subject |
必須。分割対象となる文字列です。 |
$limit |
オプション。最大で分割できる要素数を表します。デフォルト値は-1で、制限がないことを意味します。 |
$flags |
オプション。正規表現マッチングに関する追加の定数オプションを指定します。デフォルト値は0です。
ビット演算子OR(|)と組み合わせて使用できます。
|
戻り値
文字列を指定した正規表現パターンを基準に分割し、配列へ変換して返します。失敗した場合はfalseを返します。
引数$flagsによる戻り値の例
PREG_SPLIT_NO_EMPTY
空文字列を結果に含めません。このフラグを使用すると、空文字列が存在する場合でも、その結果は配列に含まれません。
PREG_SPLIT_NO_EMPTYフラグを使用する
$str = 'This,is,a,,string';
/* 指定した文字列をカンマ(,)で区切り、空文字列も結果に含めます。 */
$parts = preg_split('/,/', $str);
print_r($parts);
/* 出力:
Array (
[0] => This
[1] => is
[2] => a
[3] =>
[4] => string
)
*/
/* 指定した文字列をカンマ(,)で区切り、空文字列を結果に含めません。 */
$no_empty_parts = preg_split('/,/', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($no_empty_parts);
/* 出力:
Array (
[0] => This
[1] => is
[2] => a
[3] => string
)
*/
PREG_SPLIT_DELIM_CAPTURE
このフラグを使用すると、分割対象の区切り文字が括弧()で囲まれた式である場合、区切り文字も結果に含めます。
PREG_SPLIT_DELIM_CAPTUREフラグを使用する
$str = 'This,is,a,,string';
/* 指定した文字列をカンマ(,)で区切り、カンマ(,)も結果に含めます。 */
$with_comma_parts = preg_split('/(,)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($with_comma_parts);
/* 出力:
Array (
[0] => This
[1] => ,
[2] => is
[3] => ,
[4] => a
[5] => ,
[6] =>
[7] => ,
[8] => string
)
*/
PREG_SPLIT_OFFSET_CAPTURE
結果配列に各要素の開始位置も含めます。このフラグを使用すると、結果配列の各要素は(文字列, 開始位置)の組み合わせで構成されます。
PREG_SPLIT_OFFSET_CAPTUREフラグを使用する
$str = 'This,is,a,,string';
/* 指定した文字列をカンマ(,)で区切り、
結果配列の各要素は「(文字列, 開始位置)」の組み合わせで構成されます。 */
$with_offset_parts = preg_split('/(,)/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($with_offset_parts);
/* 出力:
Array (
[0] => Array (
[0] => This
[1] => 0
)
[1] => Array (
[0] => is
[1] => 5
)
[2] => Array (
[0] => a
[1] => 8
)
[3] => Array (
[0] =>
[1] => 10
)
[4] => Array (
[0] => string
[1] => 11
)
)
*/
活用例
preg_split()関数は、次のような場合に使用すると便利または有用です。
CSVファイルのパース
CSV(Comma-Separated Values)ファイルからデータを抽出する際に、preg_split()関数を使用できます。たとえば、次のようなCSV文字列があるとします。
$csv_data = "John,Doe,25\nJane,Smith,30\n";
ここで、カンマ(,)と改行(\n)を基準にデータを分割できます。
$lines = preg_split('/\n/', $csv_data, -1, PREG_SPLIT_NO_EMPTY);
$csv_array = [];
foreach ($lines as $line) {
$csv_array[] = preg_split('/,/', $line, -1, PREG_SPLIT_NO_EMPTY);
}
print_r($csv_array);
/* 出力:
Array (
[0] => Array (
[0] => John
[1] => Doe
[2] => 25
)
[1] => Array (
[0] => Jane
[1] => Smith
[2] => 30
)
)
*/
コード補足説明foreach()構文は、配列やオブジェクトを順番に走査しながら繰り返し処理を行う際に使用する代表的な構文です。
URLのパース
URLからプロトコル、ホスト、パスなどを抽出する際に、preg_split()関数を使用すると便利です。
$url = 'https://www.example.com/path/to/resource';
$url_parts = preg_split('#://|/#', $url, -1, PREG_SPLIT_NO_EMPTY);
print_r($url_parts);
/* 出力:
Array (
[0] => https
[1] => www.example.com
[2] => path
[3] => to
[4] => resource
)
*/
上記のコード例のように、preg_split()関数は正規表現を使用してURLを分割する際に便利です。たとえば、特定のパターンを基準にURLを細かい要素へ分割したい場合に役立ちます。
参考までに、エンコードされたクエリ文字列をデコードして変数として解析する際に使用できる関数があります。parse_url()関数です。この関数は、URLを構成要素ごとに簡単に分割して返します。この方法は、URLからプロトコル、ホスト、パスなどを個別に取得したい場合に非常に便利です。
補足説明parse_url()関数は、指定したURL文字列をパースして構成要素を返します。scheme、host、port、user、pass、path、query、fragmentなどのURL構成要素を返します。
以下のコードは、parse_url()関数を使用してURLを構成要素ごとに分割して返す簡単な例です。
$url = 'https://www.example.com/path/to/resource?query=string&foo=bar';
// URLを構成要素ごとに分割して返します
$url_components = parse_url($url);
// 結果を出力
print_r($url_components);
/* 出力:
Array (
[scheme] => https
[host] => www.example.com
[path] => /path/to/resource
[query] => query=string&foo=bar
)
*/
上記2つのURLパース例から、状況に応じて適切なURLパース方法を選択することが重要であることが分かります。単純なURLパースの場合は、parse_url()関数を使用するほうが適しており、複雑な分割が必要な場合は、preg_split()関数を検討できます。