PHPで,(カンマ)などの特定の文字列で区切った文字列を分割するには、explode()を使います。
複数の区切り文字の場合は、正規表現で分割できるpreg_match()もあります。
これを期に分割を自由自在に使いこなしましょう。
目次
explode関数による特定の文字列での分割
|
1 2 3 4 5 |
$citys = '横浜,大阪,福岡'; $tel = '090-1234-5678' print_r(explode(',',$citys)); print_r(explode('-',$tel)); |
Array
(
[0] => 横浜
[1] => 大阪
[2] => 福岡
)
Array
(
[0] => 090
[1] => 1234
[2] => 5678
)
,(カンマ)や-(ハイフン)で文字列を分割できましたね。
explode()は上記のように、区切り文字で文字列をバラバラにして配列に格納し直してくれる便利な関数です。
explode関数の構文
explode(区切り文字, 分割したい文字列, 最大要素数(省略可));
上記のサンプルでは区切り文字は,(カンマ)になっているので、explode()の区切り文字に指定し、変数$citysが対象の文字列なので、explode()の分割したい文字列に指定します。
区切りたい文字が空→ FALSE
区切りたい文字が文字列に含まれている→ 区切り文字で分割された文字列(配列)
explode()は正規表現が使えませんが、その分実行速度が速くなります。
explode関数に最大要素数を設定する
第三引数の最大要素数を設定すると、分割する文字列の数を指定できます。
|
1 2 3 |
$citys = '横浜,大阪,福岡'; print_r(explode(',',$citys, 2)); |
Array
(
[0] => 横浜
[1] => 大阪,福岡
)
第三引数に2を指定すると、2個までしか分割されず、大阪と福岡は繋がったままですね。
ちなみに第三引数に負の値(マイナス)を指定すると、後ろから指定文字数分の文字列が削除されます。
|
1 2 3 |
$citys = '横浜,大阪,福岡'; print_r(explode(',',$citys, -1)); |
Array
(
[0] => 横浜
[1] => 大阪
)
第三引数に-1を設定したため、最後から1番目の福岡が削除された配列が出来上がりました。
pleg_split関数で正規表現での文字列分割
正規表現を使い、複雑な区切り条件を付けたいならpreg_split()ですね。
|
1 2 3 |
$citys = '横浜,大阪,福岡'; print_r(preg_split('/,/',$citys)); |
Array
(
[0] => 横浜
[1] => 大阪
[2] => 福岡
)
正規表現を使い,(カンマ)で分割しました。
正規表現以外はexploe()と同じ動作ですね。
正規表現で複数の区切り文字で文字列分割
区切り文字に,(カンマ)と-(ハイフン)を使った場合はどうでしょう?
|
1 2 3 |
$stations = '横浜-新横浜, 大阪-新大阪, 福岡-博多'; print_r(preg_split('/[,-]/', $stations)); |
Array
(
[0] => 横浜
[1] => 新横浜
[2] => 大阪
[3] => 新大阪
[4] => 福岡
[5] => 博多
)
上記のように、区切り文字を複数使っても正規表現で分割できましたね。
preg_split関数の構文
preg_split(区切り文字(正規表現), 分割したい文字列, 最大要素数(省略可), フラグ(省略可));
マッチングに成功→ 区切り文字で分割された文字列(配列)を返す
マッチングに失敗→ 分割されずにそのまま突っ込まれ、要素が1つの配列を返す
explode()の正規表現版といっていいほど同じような動作ですね。
ただ、preg_match()にはフラグなど独特な引数もあります。
preg_split関数に最大要素数を設定する
第三引数の最大要素数を設定すると、分割する文字列の数を指定できます。
|
1 2 |
$citys = 'yokohama,osaka,fukuoka,nagoya'; print_r(preg_split(',',$citys, 2)); |
Array
(
[0] => yokohama
[1] => osaka,fukuoka,nagoya
)
第三引数に2を指定すると、2個までしか分割されず、osaka以降は繋がったままですね。
ちなみに、第三引数に負の数(マイナス)0nullを指定すると、制限が無いとみなされ全ての値が分割されます。
空文字を除いて文字列を分割する
preg_match()はフラグを設定することで、空文字を自動的に削除して分割する設定もできます。
|
1 2 3 |
$citys = 'yokohama,osaka,fukuoka,,nagoya'; print_r(preg_split('/,/', $citys, -1, PREG_SPLIT_NO_EMPTY)); |
Array
(
[0] => yokohama
[1] => osaka
[2] => fukuoka
[3] => nagoya
)
第三引数に-1第四引数にPREG_SPLIT_NO_EMPTY(必ず大文字)のフラグを設定します。
変数$citysをよく見ると、fukuokaとnagoyaの間に''(空文字)がありますが、上記を見ると空文字を除いた配列が出来ていますね。
ただ、空文字にスペース' 'が入ると、取り除かれずにそのまま配列化されてしまうので注意しましょう。
他に下記のフラグがあります。
PREG_SPLIT_DELIM_CAPTURE→ サブパターンでキャプチャされた値も同時に返す。PREG_SPLIT_OFFSET_CAPTURE→ 各文字列のオフセット(区切り文字の位置)も返す。(マルチバイト文字だとおかしな数字になる)
フラグを設定する際は以下の点に注意しましょう。
- フラグを設定する際は第三引数に必ず「-1」を設定する。
- フラグは必ず大文字で設定する。
|(縦棒)で複数選択可。
(PREG_SPLIT_DELIM_CAPTUREの使い方はまだイマイチ分かっていません汗)
正規表現を使わないとエラーが出ますし、速度も遅いため、正規表現を使わない場合はexplode()を使うようにしましょう。
split関数で分割(非推奨)
split()はPHP5.3で非推奨となり、PHP7.0で削除されました。
preg_split()を使うように推奨されていますが、たまに見かけることもあるかと思いますので一応紹介だけします。
|
1 2 3 |
$citys = 'yokohama,osaka,fukuoka,nagoya'; print_r(split(',', $citys)); |
Array
(
[0] => yokohama
[1] => osaka
[2] => fukuoka
[3] => nagoya
)
動作はpreg_split()とほとんど変わりません。
split関数に最大要素数を設定する
第三引数の最大要素数を設定すると、分割する文字列の数を指定できます。
|
1 2 |
$citys = 'yokohama,osaka,fukuoka,nagoya'; print_r(split(',',$citys, 2)); |
Array
(
[0] => yokohama
[1] => osaka,fukuoka,nagoya
)
第三引数に2を指定すると、2個までしか分割されず、osaka以降は繋がったままですね。
ちなみに、split()は第三引数に負の数(マイナス)の数は設定できません。
非推奨ですし、preg_split()に比べ制約も多いため、preg_split()を使いましょう。
正規表現で複雑な動作も便利ですが、なるべくなら単純で高速なexplode()で済ませたいものですね。
逆に、配列を文字列に結合するなら、implode()が簡単ですよ。
