区切り文字で文字列を分割する関数といえばexplode関数を思いつく方もいると思います。
しかしexplodeは、1つの区切り文字でしか分割できません。
そこで今日は、複数の区切り文字で文字列を分割する方法をご紹介します。
複数の区切り文字で文字列を分割する方法
先日、会社のシステムで検索機能を実装していると
依頼者から条件をコンマ(,)か句読点(、)で区切りたいとの要望が入ってきました💦
このように複数の区切り文字で分割したい時って意外とあったりします!
preg_split関数
まず、preg_split関数を使った分割方法を説明します。
preg_split関数とは、正規表現パターンを使用して文字列を分割するためのPHPの関数です。preg_splitは、指定された正規表現パターンに基づいて文字列を分割し、結果を配列として返します。
例文
以下は、preg_split関数の使用例です。
$str = "apple,banana-orange;grape";
$fruits = preg_split("/[,;-]/", $str);
print_r($fruits);
// 出力結果
Array
(
[0] => apple
[1] => banana
[2] => orange
[3] => grape
)
この例では、"/[,;-]/"
という正規表現パターンを使用して、カンマ,
、ハイフン-
、セミコロン;
のいずれかを区切り文字として文字列を分割します。結果は上記のようになります。
注意点
preg_split関数は環境によって文字化けしてしまう事があります😭
例えば、下記のコードだと文字化けします。
$splitList = preg_split("/[\s,、]+/", "ほげ、ほげ");
print_r($splitList);
文字化けが発生する主な原因は、正規表現パターン内でマルチバイト文字(UTF-8などの多バイト文字セット)を扱う際に、”uフラグ”を指定していないことです。
以下が修正したコードになります。
$splitList = preg_split("/[\s,、]+/u", "ほげ、ほげ");
print_r($splitList);
もし文字化になった時は、uを付け足してみてください!
mb_split関数
次にご紹介するのはmb_split関数です。
mb_split関数は、マルチバイト文字(UTF-8など)を含む文字列を指定した区切り文字で分割するためのPHPの関数です。文字列のエンコーディングを考慮して正確な分割を行います。
例文
以下は、mb_split関数の使用例です。
$str = "apple,banana-orange;grape";
$fruits = mb_split("[,-;]", $str);
print_r($fruits);
//出力結果
Array
(
[0] => apple
[1] => banana
[2] => orange
[3] => grape
)
preg_split関数と同じように区切る事ができます。
では、preg_split関数とmb_split関数では何が違うのでしょうか。
preg_split関数とmb_split関数の違い
以下はpreg_split関数とmb_split関数の主な特徴です。
preg_split関数
- 正規表現パターンを使用して文字列を分割する。
- 正規表現エンジンによってパターンマッチングが行われる。
- マルチバイト文字を含む文字列の分割にも使用できる。
- パターンマッチングによる柔軟な分割が可能。
- 正規表現パターンによる高度な分割が必要な場合に適している。
- preg_split関数の方が高速
mb_split関数:
- 指定した区切り文字を使用して文字列を分割する。
- マルチバイト文字を正確に扱うことができる。
- 文字列のエンコーディングを考慮した分割を行う。
- 簡単な区切り文字による分割に使用することができる。
- マルチバイト文字を含む文字列のシンプルな分割に適している。
まとめると、preg_split関数は正規表現パターンを使用し、より柔軟な分割を行うことができます。一方、mb_split関数は、マルチバイト文字を正確に扱い、文字列のエンコーディングを考慮したシンプルな分割を行うことができます。
まとめ
マルチバイト文字を含む文字列をシンプルに分割する場合には、mb_split関数が便利です!
一方、より複雑なパターンに基づいて分割する必要がある場合や、正規表現エンジンの機能を活用したい場合には、preg_split関数が適しています。
それでは、最後までお読みいただきありがとうございました🙇