PHPで文字列を分解して配列で取得したい場合、preg_split・explode・str_splitの3つの関数のどれを使えばいいのかいつも迷ってしまう。
なんとな〜く覚えているだけだと、なんども調べ直す羽目になってしまうので、これら3つの関数はそれぞれお何が違うのか、一度整理してみようと思います。
preg_split() - 正規表現を使用できる
正規表現で文字列を分割するための関数です。3つの関数の中では唯一正規表現を使用できます。
使用形式
preg_split($pattern , $subject [, $limit = -1 [, $flags = 0 ]])
引数 | 説明 |
---|---|
$pattern | (string) 検索するパターンを表す文字列。区切りキーワード |
$subject | (string) 分割したい文字列。 |
$limit | (int) これを指定した場合、最大 $limit 個の部分文字列を返し、残りの文字列は最後の部分文字列に含めて返される。 $limit が -1、0 あるいは NULL の場合は制限なし。 |
$flags | 次のフラグを組み合わせたものを指定できる。(ビット和演算子 | で組み合わせる) PREG_SPLIT_NO_EMPTY 空文字列でないものだけが 返されるようになる。 PREG_SPLIT_DELIM_CAPTURE 文字列分割用パターンで、カッコによるサブパターンを使用するとその分割用パターン文字列も配列の要素に含まれるようになる。 PREG_SPLIT_OFFSET_CAPTURE 各マッチに対応する文字列のオフセット値も返されるようになる。 返り値の配列の各要素はさらに配列となり、[0] はマッチした文字列、 [1] は$subject におけるマッチした文字列のオフセット値。 |
戻り値
$pattern
にマッチした境界で分割した$subject
の部分文字列の 配列。
マッチングに失敗した場合は、入力文字列そのままの、 要素が一つだけの配列を返します。
また、以下のような注意書きがありました。
正規表現の威力を必要としないのなら、より高速な (機能はシンプルですが) 代替関数として explode() あるいは str_split() のような選択肢があります。
つまり、正規表現が使えるけど、その分負担が大きいので必要のないときは無闇に使うな、ということみたいです。
explode() - 単純にキーワードで文字列を分解する
文字列を、文字列のキーワードを元に分解する関数です。(「,」という文字列で分解したい場合など。)
使用形式
explode($delimiter , $string [, $limit = PHP_INT_MAX ])
引数 | 説明 |
---|---|
$delimiter | (string) 区切り文字列。 |
$string | (string) 分割したい文字列。 |
$limit | (int) 正の値が指定された場合、返される配列には 最大 $limit の要素が含まれ、$string の残りの部分は全て最後の要素含まれる。 負の場合、 最後の -$limit 個の要素を除く全ての構成要素が返される。(負の値はver.5.1.0以降で指定可能) ゼロの場合は、1 を指定したものとみなされるので注意。 |
戻り値
$string
の内容を $delimiter
で分割した文字列の配列。
空の文字列 ("") が $delimiter として使用された場合、 explode() は FALSE を返します。$delimiter に引数 $string に含まれていない値が含まれている場合は、 $limit が負の値なら空の配列、そうでなければ 引数 $string を含む配列を返します。
str_split() - 文字数で分解する
文字列を、単純に文字数ごとに分割する関数。
使用形式
str_split($string [, $split_length = 1 ])
引数 | 説明 |
---|---|
$string | (string) 分割したい文字列。 |
$split_length | (int) 分割する文字数の最大長。 |
戻り値
$split_length
が指定されている場合、$split_length
ごとに文字列を分解した配列が返されます。
それ以外の場合は、1 文字ずつ分割された配列。
$split_length が 1 より小さい場合に FALSE を返します。$split_length が $string の長さより大きい場合、文字列全体が 最初の要素となる配列を返します。
まとめ
以上をまとめると、
preg_split()
正規表現が使える。複雑なパターン(タグなど)で文字列を分解したい場合に使用する
explode()
preg_splitより処理が早い。「,」や「/」など単純な文字列で分解したい場合はこっち。
str_split()
単純な文字数による分解。他の2つと機能的には全然違うのに、preg_split()と名前が似てるせいでややこしい。
といった感じでしょうか。