PHP 複数の区切り文字で文字列を分割する方法

文字列を分割するメソッド explode は区切り文字を1語しか指定できないので、2語以上指定しても分割できるように考えてみました。

ただ、3語以上で分割するコードは、もしかしたらもっとスマートなコードがあるかもしれません。少し回りくどい事をやっているような気もするコードなので、もっと簡単にできるよ!という場合は教えて下さい。

PHP explode

区切り文字1語で文字列を分割する explode の使い方は

explode('区切り文字', '文字列')

です。戻り値は配列です。これを、2語以上でも使えるように拡張させます。

参考:PHP: explode - Manual

2語で分割する場合

PHP

<?php

function double_explode($word1, $word2, $str) {
    $return = array();

    //分割文字その1で文字列を分割
    $array = explode($word1, $str);

    //各配列を分割文字その2で分割して結合していく
    foreach ($array as $value) {
        $return = array_merge($return, explode($word2, $value));
    }
    return $return;
}


//使用例
$str = 'a,b,c:d:e,f:g';
$new_str_array = double_explode(',', ':', $str);

//出力
//=> array('a', 'b', 'c', 'd', 'f', 'g')

?>

まずは2語で分割する場合。使い方は簡単です。

double_explode('区切り文字その1', '区切り文字その2', '文字列')

の形で explode に1語足したような形で利用できます。出力は配列でされます。

スポンサーリンク

3語以上で分割する場合

PHP

<?php

function ex_explode($word_array, $str) {
    $return = array();

    //文字列を配列に入れる
    $array = array($str);

    //分割文字ごとにforeach
    foreach ($word_array as $value1){

        //文字列の配列を分割
        foreach ($array as $key => $value2) {
            $return = array_merge($return, explode($value1, $value2));

            //配列の最後になったら初期化
            if(count($array) - 1 === $key) {
                $array = $return;
                $return = array();
            }
        }
    }
    return $array;
}


//使用例 その1
$str = 'a,b,c:d:e,f:g.h.i';
$new_str_array = ex_explode(array(',',':','.'), $str);

//出力
//=> array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i')

//使用例 その2
$str2 = 'a,b,c:d:e,f:g';
$new_str_array2 = ex_explode(array(',', ':', 'e'), $str2);

//出力
//=> array('a', 'b', 'c', 'd', '', '', 'f', 'g')

?>

3語以上で分割する場合は、区切り文字を配列に入れます。

ex_explode(array('区切り文字その1', '区切り文字その2', '区切り文字その3'), '文字列')

上の例は3語区切り文字を指定しましたが、4語でも5語でも指定可能です。

「使用例 その2」で示しているように、区切り文字が隣接している場合は空白文字列が出てしまうので、不都合な場合は除去してください。explode 本家も隣接している場合は空白文字が出るので同じ仕様です。

まとめ

区切り文字2語の分割を使いたかったのでそちらをまず考えて、そのあと3語以上に拡張できないか考えました。その結果、3語以上はあまり綺麗なコードじゃありません…。3語以上の場合は文字列をまず検索して、その後その文字の位置で分割する、とかの方が良いかもしれません。

explode での文字列分割でしたが explode の部分を mb_split や preg_split に変えることで、マルチバイト対応、正規表現対応もできると思われます。(チェックはしていません)

また、例外処理等も全く入れていないので必要な場合は入れてください。

Top