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)
分割パターン省略時
引数の順番から分割パターンは省略できない。
分割パターンが空の文字列の場合
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もあります。
分割パターンの正規表現が . だったら?
JavaScriptやEmacsと同じになった。
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" }