PHP 複数の区切り文字で文字列を分割する方法
文字列を分割するメソッド explode は区切り文字を1語しか指定できないので、2語以上指定しても分割できるように考えてみました。
ただ、3語以上で分割するコードは、もしかしたらもっとスマートなコードがあるかもしれません。少し回りくどい事をやっているような気もするコードなので、もっと簡単にできるよ!という場合は教えて下さい。
区切り文字1語で文字列を分割する explode の使い方は
explode('区切り文字', '文字列')です。戻り値は配列です。これを、2語以上でも使えるように拡張させます。
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 に変えることで、マルチバイト対応、正規表現対応もできると思われます。(チェックはしていません)
また、例外処理等も全く入れていないので必要な場合は入れてください。