Как можно разделить текст на массив предложений?
Пример текста:
Обжарь меня Бобром. Обжари меня Бобром! Обжарить меня Бобром? Фрай меня, Бивер, нет. 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 + и делаем две вещи:
(? <= [.?!]) Положительный взгляд за утверждением, в основном мы ищем, если за пространством есть знак точки или вопроса или восклицательный знак.
(? = [az]) Позитивный взгляд вперед, поиск, если есть буква после пробела, это своего рода обходное решение для no. 4
no. 4
проблема.