web-dev-qa-db-ja.com

preg_split()の結果に分割区切り文字を含めるにはどうすればよいですか?

テキストをピリオドに分割するこの単純なパターンがあります。

$text = preg_split("/[\.:!\?]+/", $text);

しかし、配列項目の最後に. :または!を含めたいと思います。

つまり、今は「good:news.everyone!」です。私が持っています:

array("good", "news", "everyone", "");

でも私はしたい:

array("good:", "news.", "everyone!", "");
20
skyline26

どうぞ:

preg_split('/([^.:!?]+[.:!?]+)/', 'good:news.everyone!', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

仕組み:パターンは実際にはすべてを区切り文字に変えます。次に、これらの区切り文字を配列に含めるには、PREG_SPLIT_DELIM_CAPTURE定数を使用できます。これにより、次のような配列が返されます。

array (
    0 => '',
    1 => 'good:',
    2 => '',
    3 => 'news.',
    4 => '',
    5 => 'everyone!',
    6 => '',
);

空の値を取り除くには、PREG_SPLIT_NO_EMPTYを使用します。これらの定数の2つ以上を組み合わせるには、ビット単位の|演算子を使用します。結果:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);
47

パターンで ポジティブルックビハインド を使用する場合、_PREG_SPLIT_DELIM_CAPTURE_は使用できません。関数は区切り文字を保持します。

_$text = preg_split('/(?<=[.:!?])/', 'good:news.everyone!', 0, PREG_SPLIT_NO_EMPTY);
_

lookbehindを使用すると、一致せずに文字を検索するだけです。したがって、preg_split()の場合、関数は文字を破棄しません。

結果なし_PREG_SPLIT_NO_EMPTY_フラグ:

_array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!',
    3 => ''
);
_

結果with_PREG_SPLIT_NO_EMPTY_フラグ:

_array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);
_

これを使用してテストできます PHP Online Function Tester

5
pmrotule