Разделить текст на предложения

Как можно разделить текст на массив предложений?

Пример текста:

Обжарь меня Бобром. Обжари меня Бобром! Обжарить меня Бобром? Фрай меня, Бивер, нет. 4 ?! Обжари меня много бобров … Конец

Должен выводиться:

0 => Fry me a Beaver. 1 => Fry me a Beaver! 2 => Fry me a Beaver? 3 => Fry me Beaver no. 4?! 4 => Fry me many Beavers... 5 => End 

Я пробовал некоторые решения, которые я нашел на SO через поиск, но все они не работают, особенно в четвертом предложении.

 /(?<=[!?.])./ /\.|\?|!/ /((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[AZ])/ /(?<=[.!?]|[.!?][\'"])\s+/ // <- closest one 

Так как вы хотите «разделить» предложения, почему вы пытаетесь их сопоставить?

Для этого случая давайте использовать preg_split () .

Код:

 $str = 'Fry me a Beaver. Fry me a Beaver! Fry me a Beaver? Fry me Beaver no. 4?! Fry me many Beavers... End'; $sentences = preg_split('/(?<=[.?!])\s+(?=[az])/i', $str); print_r($sentences); 

Вывод:

 Array ( [0] => Fry me a Beaver. [1] => Fry me a Beaver! [2] => Fry me a Beaver? [3] => Fry me Beaver no. 4?! [4] => Fry me many Beavers... [5] => End ) 

Объяснение:

Ну, проще говоря, мы разделяем сгруппированное пространство (ы) \ s + и делаем две вещи:

  1. (? <= [.?!]) Положительный взгляд за утверждением, в основном мы ищем, если за пространством есть знак точки или вопроса или восклицательный знак.

  2. (? = [az]) Позитивный взгляд вперед, поиск, если есть буква после пробела, это своего рода обходное решение для no. 4 no. 4 проблема.