PHPで文字列を分割する5つの関数!(explodeなど)

PHP

PHPで文字列を分割する方法について書いています。
下記の関数を使って、文字列を分割することが可能です。

・explode関数
・str_split関数
・mb_str_split関数
・preg_split関数
・mb_split関数

サンプルコードは、PHPバージョン8.1.8で検証しています。

explode関数で分割する(文字区切り)

explode関数を使うことで、文字列を分割することができます。
explode関数での文字列分割の指定には、文字列を使います。
公式ドキュメントはこちらにあります。

例えば、下記のように使います。

<?php
$fruits = 'apple orange lemon grape';
$result = explode(' ', $fruits);
var_dump($result);

$fruits変数に半角スペースで区切った、文字列「apple orange lemon grape」を代入しました。

次の行で、explode関数を使っています。
第1引数に文字列を分割するための文字列を指定します。今回は半角スペースです。
第2引数には分割する文字列を指定します。$fruits変数を渡しました。

返り値として、分割した文字列が配列に入って返ってきます。
$result変数で受け取って、var_dump関数で出力してみました。

そうすると、下記のように文字列が分割されたことが確認できました。

array(4) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(6) "orange"
  [2]=>
  string(5) "lemon"
  [3]=>
  string(5) "grape"
}

改行コードで分割する

explode関数を使った場合には、改行コードやタブなどの特殊文字で分割することも可能です。
下記は改行コードを使った場合の文字列分割です。

<?php
$fruits = <<<EOF
apple
orange
lemon
grape
EOF;

var_dump(explode("\n", $fruits));

$fruits変数に、ヒアドキュメントで文字列を改行して入力しました。
explode関数の第1引数に「"\n"」とすることで、改行コードを指定します。
var_dump関数で出力すると、下記のように配列になりました。

array(4) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(6) "orange"
  [2]=>
  string(5) "lemon"
  [3]=>
  string(5) "grape"
}

タブ文字で分割する

同様にして、下記はタブ文字を使った場合の文字列分割です。

<?php
$fruits = <<<EOF
apple   orange  lemon   grape
EOF;

var_dump(explode("\t", $fruits));

$fruit変数に代入した文字列の間にタブ文字を入れています。
explode関数の第1引数に「"\t"」とすることで、タブ文字を指定します。
var_dump関数で出力すると、下記のように配列になりました。

array(4) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(6) "orange"
  [2]=>
  string(5) "lemon"
  [3]=>
  string(5) "grape"
}

マルチバイト文字でも動作可能

今回は半角英数のみでしたが、日本語でも動作します。
例えば、下記のように日本語を指定して分割した場合です。

$fruits = 'りんご、オレンジ、レモン、ぶどう';
var_dump(explode('、', $fruits));

分割対象の文字列として「りんご、オレンジ、レモン、ぶどう」を$fruitsに代入しました。
区切り文字として、全角の「」を使いました。

var_dump関数で出力すると、下記のように分割されていることが確認できました。

array(4) {
  [0]=>
  string(9) "りんご"
  [1]=>
  string(12) "オレンジ"
  [2]=>
  string(9) "レモン"
  [3]=>
  string(9) "ぶどう"
}

str_split関数で分割する(文字数指定)

str_split関数を使うと、文字列を指定した文字数で分割します。
公式ドキュメントはこちらにあります。

例えば、下記のように使います。

<?php
$fruits = 'apple orange banana';
$result = str_split($fruits, 5);
var_dump($result);

$fruits変数に分割対象の文字列「apple orange banana」を代入しました。

次の行でstr_split関数を使っています。
第1引数に分割する文字列、第2引数に分割する文字数を指定します。
第2引数に指定した文字数ごとに、分割されて配列に格納されます。

$result変数で、分割された文字列の配列を、返り値として受け取っています。
var_dump関数で出力すると、下記のように分割されたことが確認できました。

array(4) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(5) " oran"
  [2]=>
  string(5) "ge ba"
  [3]=>
  string(4) "nana"
}

それぞれ、配列に5文字ずつ入っていますが、文字数が足りずに最後は4文字になっています。

str_split関数では、マルチバイト文字(日本語など)は使うことができません。
日本語を指定文字数で分割したい場合には、次項で紹介するmb_str_split関数を使います。

文字列をひとつずつ配列に入れる

str_split関数で、文字数を指定しない場合は、文字列のひとつひとつが配列に格納されます。
例えば、下記のように使った場合です。

<?php
$fruits = 'apple';
$result = str_split($fruits);
var_dump($result);

$fruits変数には「apple」という文字列を入れています。
str_split関数に文字列の入った$fruits変数のみを渡しています。
var_dump関数で出力すると、文字数を指定していないので、下記のように1文字ずつ分割されます。

array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "p"
  [2]=>
  string(1) "p"
  [3]=>
  string(1) "l"
  [4]=>
  string(1) "e"
}

文字列が1文字ずつ、配列入って返ってきていることが確認できました。

mb_str_split関数で分割する

str_split関数のマルチバイト対応バージョンです。
公式ドキュメントはこちらにあります。

日本語もこちらの関数を使うことで、文字数を指定して分割できます。

<?php
$fruits = 'りんご オレンジ バナナ';
$result = mb_str_split($fruits, 3);
var_dump($result);

$fruits変数に日本語の文字列「りんご オレンジ バナナ」を代入しています。

次の行で、mb_str_split関数を使っています。
第1引数に分割する$fruits変数を渡して、第2引数に3文字で分割するように「3」を指定しました。

var_dumpで確認すると、下記のように文字化けせずに分割されていることが確認できました。

array(4) {
  [0]=>
  string(9) "りんご"
  [1]=>
  string(7) " オレ"
  [2]=>
  string(7) "ンジ "
  [3]=>
  string(9) "バナナ"
}

preg_split関数で分割する

preg_split関数を使うと、分割する対象の箇所を正規表現で探すことができます。
公式ドキュメントはこちらにあります。

例えば、下記のように使います。

$fruits = 'apple30orange20grape15';
$result = preg_split('/[0-9]{2}/', $fruits);
var_dump($result);

$fruits変数に分割対象の文字列「apple30orange20grape15」を代入しています。

次の行で、preg_split関数を呼び出しています。
第1引数に分割する箇所を正規表現で書きます、第2引数に分割対象の文字列を指定します。

今回は「/[0-9]{2}/」としているので、文字列で数値2桁の箇所が分割対象になります。
文字列の中の「30」、「20」、「15」で文字列が分割されて、配列として結果が返ってきます。

var_dump関数で出力すると、下記のように数値箇所で分割されて、配列が返ってきたことが確認できました。

array(4) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(6) "orange"
  [2]=>
  string(5) "grape"
  [3]=>
  string(0) ""
}

u修飾子で文字化け回避する

正規表現の箇所にu修飾子を使うことで、Unicodeを使っている場合などには文字化けが起きないようにすることができます。
下記のように、正規表現に全角の「、」や全角スペースを入れた場合に文字化けします。

var_dump(preg_split("/[\s、 ]+/", "オレンジ ぶどう りんご バナナ"));

このようにu修飾子を使うと、回避することが可能です。

var_dump(preg_split("/[\s、 ]+/u", "オレンジ ぶどう りんご バナナ"));

出力すると、結果は下記になります。

array(4) {
  [0]=>
  string(12) "オレンジ"
  [1]=>
  string(9) "ぶどう"
  [2]=>
  string(9) "りんご"
  [3]=>
  string(9) "バナナ"
}

mb_split関数で分割する

preg_split関数と同様にmb_split関数を使うことで、正規表現で分割箇所を指定して、分割可能です。
公式ドキュメントはこちらにあります。

例えば、下記のように使います。

<?php
$fruits = 'りんご100円 オレンジ200円 ぶどう500円';
$result = mb_split('[0-9]{3}円', $fruits);
var_dump($result);

$fruits変数に分割対象の文字列「りんご100円 オレンジ200円 ぶどう500円」を代入しています。

次の行で、mb_split関数を呼び出しています。
第1引数に分割する箇所の正規表現、第2引数に分割対象の文字列を指定します。

第1引数に指定しているのが「[0-9]{3}円」なので、数値3桁で円がついている箇所が対象になります。
var_dump関数で出力すると、下記のように分割されていることが確認できました。

array(4) {
  [0]=>
  string(9) "りんご"
  [1]=>
  string(13) " オレンジ"
  [2]=>
  string(10) " ぶどう"
  [3]=>
  string(0) ""
}

preg_split関数との違いは、多くの文字コードに対応しているようです。
検証していませんが、こちらに書いてありました。

文字列分割の関数まとめ

文字列分割の関数を表にまとめました。

関数名 分割対象指定 備考
explode 文字列で分割箇所を指定する 文字で分割したい場合に使いやすい。マルチバイト文字対応。
str_split 文字数で分割対象を指定する 文字数で分割したいときに使う。マルチバイト文字非対応。
mb_str_split 文字数で分割対象を指定する 文字数で分割したいときに使う。マルチバイト文字対応。
preg_split 正規表現で分割対象を指定する 正規表現で分割対象を指定する。正規表現にu修飾子を加えることで、マルチバイト文字対応。
mb_split 文字数で分割対象を指定する 正規表現で分割対象を指定する。マルチバイト対応。

コメント

タイトルとURLをコピーしました