splitの研究 in PHP

高林さんがsplit の研究というエントリを書かれています。それに対してtwkさんが

split の研究・・・ PHP 募集中 > http://tinyurl.com/5qlu66

http://twitter.com/twk/statuses/905375092

とつぶやいていたので調べてみました。ちなみにphp-5.2.5です。


最初よく確認もせずにtwkさんを高林さんと勘違いしてました。すいません。

普通に分割

var_dump(split(',', 'a,b,c'));
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

末尾の空要素は省略されない

var_dump(split(',', 'a,,c,,'));
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(0) ""
  [2]=>
  string(1) "c"
  [3]=>
  string(0) ""
  [4]=>
  string(0) ""
}

空文字列だと結果も空

var_dump(split(',', ''));
array(1) {
  [0]=>
  string(0) ""
}

空文字列に対して分割パターンも空文字

実はPHPのsplitが受け付ける分割パターンは正規表現のみ。分割パターンがない場合はWarning発生 & falseが返る。

var_dump(split('', ''));
Warning: split(): REG_EMPTY in /path/to/split.php on line XX

bool(false)

分割パターン省略時

引数の順番から分割パターンは省略できない。

分割パターンは文字列か?

正規表現のみ。文字列で分割したいときはexplodeを使う。

分割パターンが空の文字列の場合

Warning発生 & false

分割パターンが正規表現

var_dump(split('[:;]', 'a:b;c.d'));
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(3) "c.d"
}

ちなみに正規表現エンジンとしてPCREを用いるpreg_splitもあります。

分割パターンの正規表現が . だったら?

JavaScriptEmacsと同じになった。

var_dump(split('.', 'a:b;c.d'));
array(8) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  [4]=>
  string(0) ""
  [5]=>
  string(0) ""
  [6]=>
  string(0) ""
  [7]=>
  string(0) ""
}

文字としての . にマッチさせるにはエスケープが必要

var_dump(split('\.', 'a:b;c.d'));
array(2) {
  [0]=>
  string(5) "a:b;c"
  [1]=>
  string(1) "d"
}