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

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