phpでpreg_splitにPREG_SPLIT_DELIM_CAPTUREを指定しても、デリミタが取れない。

phpでpreg_splitを用いて正規表現でデリミタを指定して文字列を分割してみた。 preg_split 正規表現で文字列を分割する この際にデリミタ文字も取得したかったので、preg_splitの引数にPREG_SPLIT_DELIM_CAPTUREを指定した。

PREG_SPLIT_DELIM_CAPTURE このフラグを設定すると、文字列分割用のパターン中の カッコによるサブパターンでキャプチャされた値も同時に返されます。 なんと便利な関数だろう。期待していた機能を持っている。 早速preg_splitを使ってみた。

<?php
// もとの文字列
$str = "今日は良い天気です。明日は雨のようです。昨日は雪でした!去年は寒い一年でした。";

//  。!で文字列を分割する。
$ret = preg_split("/[。!]/u", $str,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

print_r($ret);
?>

結果
Array
(
    [0] => 今日は良い天気です
    [1] => 明日は雨のようです
    [2] => 昨日は雪でした
    [3] => 去年は寒い一年でした
)

あれ、デリミタがとれていない。 PHPの

preg_split ? 正規表現で文字列を分割する公式ドキュメントサイトを良く読むと、

PREG_SPLIT_DELIM_CAPTURE このフラグを設定すると、文字列分割用のパターン中の カッコによるサブパターンでキャプチャされた値も同時に返されます。 また、公式ドキュメントサイトのpreg_split のコメントには同様の書き込みがある。 ようするに正規表現のカッコが足りないのだった…

<?php
// もとの文字列
$str = "今日は良い天気です。明日は雨のようです。昨日は雪でした!去年は寒い一年でした。";

//  。!で文字列を分割する。
$ret = preg_split("/([。!])/u", $str,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

print_r($ret);
?>

結果
Array
(
    [0] => 今日は良い天気です
    [1] => 。
    [2] => 明日は雨のようです
    [3] => 。
    [4] => 昨日は雪でした
    [5] => !
    [6] => 去年は寒い一年でした
    [7] => 。
)

正規表現で取得する箇所をカッコで括ったら取得できた!

/[。!]/u
  
/([。!])/u

ドキュメントはしっかり読まなければ…