PHPプログラミング

レシピ

文字列

特定の文字で文字列を分割する:preg_split関数

preg_split関数を使って、特定の文字で文字列を分割する方法を解説します。

この記事のポイント

  • 指定した文字で文字列を分割できる
  • 分割した回数や分割位置は取得できる
  • マルチバイトでは分割した位置を取得する時に注意する

目次

指定した文字で文字列を分割する

preg_split関数は正規表現による文字列検索を行い、ヒットした部分で文字列を分割します。

コード例

preg_split( '/\./', $str);

上記コードでは、$strから「. (ドット)」を探し、見つかったら分割をします。
(エスケープシーエンスで「\ (バックスラッシュ)」を付けています)

返り値は分割後の文字列を配列形式にして返します。

コード例

$str1 = "cat is cat.cat play a trick.but so pretty.";
$str2 = null;

// 文字列の分割
$str2 = preg_split( '/\./', $str1);

// 出力
var_dump($str2);

出力例

array(4) {
	[0]=> string(10) "cat is cat"
	[1]=> string(16) "cat play a trick"
	[2]=> string(13) "but so pretty"
	[3]=> string(0) ""
}

PHPの正規表現ではpreg_match関数がよく使われますが、この関数に文字列の分割機能がついたものになります。
正規表現による検索については共通のため、検索方法の基礎については別記事「文字列に特定の文字(単語)が含まれるか検索」をご覧ください。

分割個数を指定する

preg_split関数に3つ目のパラメータとして数値を渡すと、文字列の分割個数を指定することができます。

コード例

$str1 = "cat is cat.cat play a trick.but so pretty.";
$str2 = null;

// 文字列の分割
$str2 = preg_split( '/\./', $str1, 2);

// 出力
var_dump($str2);

出力例

array(2) {
	[0]=> string(10) "cat is cat"
	[1]=> string(30) "cat play a trick.but so pretty."
}

今回のように「2」を指定すると、「最大2つの文字列に分割する」という指定になります。
やや紛らわしいですが、分割する回数が2回までというわけではないことに注意してください
2」の場合は「分割後の文字列が2つまで」となるため、分割する回数は1度のみということになります。

初期値は無制限の「-1」で、指定する場合は「-1」、または「1」以上の値を指定する必要があります。
ちなみに「0」も無制限の指定になります。

分割後の文字が空だった場合にスキップする

文字列を分割した結果には、分割後の文字列が空であっても返り値に含まれるようになっています。
もし空の時には返り値として不要の場合、4つ目のパラメータに定数「PREG_SPLIT_NO_EMPTY」を指定することでスキップすることができます。

コード例

$str1 = "cat is cat.cat play a trick.but so pretty.";
$str2 = null;

// 文字列の分割
$str2 = preg_split( '/\./', $str1, -1, PREG_SPLIT_NO_EMPTY);

// 出力
var_dump($str2);

出力例

array(3) {
	[0]=> string(10) "cat is cat"
	[1]=> string(16) "cat play a trick"
	[2]=> string(13) "but so pretty"
}

分割された場所を取得する

文字列が何文字目で分割されたのかを調べたい場合は、4つ目のパラメータに「PREG_SPLIT_OFFSET_CAPTURE」を指定します。

コード例

$str1 = "cat is cat.cat play a trick.but so pretty.";
$str2 = null;

// 文字列の分割
$str2 = preg_split( '/\./', $str1, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);

// 出力
var_dump($str2);

出力される値は「分割後の文字列」と「分割された位置」の順に格納された多次元配列になります。

出力例

array(3) {
	[0]=> array(2) {
		[0]=> string(10) "cat is cat"
		[1]=> int(0)
	}
	[1]=> array(2) {
		[0]=> string(16) "cat play a trick"
		[1]=> int(11)
	}
	[2]=> array(2) {
		[0]=> string(13) "but so pretty"
		[1]=> int(28)
	}
}

なお、上記コードのように4つ目のパラメータは必要に応じて「| (パイプライン)」で区切ることで複数指定することも可能です。

注意点として、日本語の文字列を区切る場合はマルチバイトでのカウントとなることです。
次のコード例と出力例をみてください。

コード例

$str1 = "猫はとても可愛いが、時々いたずらをする。";
$str2 = null;

// 文字列の分割
$str2 = preg_split( '/い/', $str1, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);

// 出力
var_dump($str2);

出力例

array(3) {
	[0]=> array(2) {
		[0]=> string(21) "猫はとても可愛"
		[1]=> int(0)
	}
	[1]=> array(2) {
		[0]=> string(12) "が、時々"
		[1]=> int(24)
	}
	[2]=> array(2) {
		[0]=> string(21) "たずらをする。"
		[1]=> int(39)
	}
}

$strの文字列を「」で分割した結果、上記のように「が、時々」という文字は8文字目で開始かと思いきや、3倍「24」という値が入っています。
これは日本語がマルチバイトで1文字あたり3バイト使っていることが原因です。
つまり、日本語の文字列を分割した後に分割位置を調べたい場合は、返り値を3で割るなどして帳尻を合わせる必要があります。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。