PHP + Разделить абзац на массив

Я не могу найти никакого решения для этого. Пожалуйста помоги. Мне нужно разбить этот «абзац» на массив предложений:

$ paragraph = "a. b. c. привет o.c .. привет, мир -в .. привет. мир. 8.5 привет, мир.";

Результирующий массив должен выглядеть так:

0=>a.
1=>b.
2=>c.
3=>hell o.c.
4=>hello world -in.
5=>hello.
6=>world.
7=>8.5 hello world.

Я зашел так далеко

preg_split('/(?<=[.?!;:])\s+/', $sentence, -1, PREG_SPLIT_NO_EMPTY);

Но это не позволяет использовать десятичное число.


person IMG Imports Inc.    schedule 27.03.2016    source источник
comment
Почему hell o.c.? Ваш код работает так, как я ожидал, eval.in/542844, возможно, опечатка во входной переменной? $sentence вместо _3 _... или, может быть, вы пытаетесь сделать что-то еще?   -  person chris85    schedule 27.03.2016
comment
o.c. И в. это 2 сокращения, которые используются в нашем бизнесе, и я не могу допустить, чтобы произошло разделение.   -  person IMG Imports Inc.    schedule 27.03.2016
comment
Как ваш текущий код не работает и почему hell o.c., а не hello o.c.? Может быть, вам нужно предоставить более длинную строку образца, где проблема более заметна?   -  person chris85    schedule 27.03.2016
comment
См. Следующее: eval.in/542852 Я не хочу, чтобы он разделял размеры.   -  person IMG Imports Inc.    schedule 27.03.2016
comment
eval.in/542853 0-1 и 5-6 не должны разделяться таким образом.   -  person IMG Imports Inc.    schedule 27.03.2016
comment
Почти. 3-4 должно состоять из одного предложения: Эта раковина просверливается под 8 дюймов. o.c. кран.   -  person IMG Imports Inc.    schedule 27.03.2016
comment
Пример в вашем вопросе плохой, потому что ваша настоящая строка содержит буквы в верхнем регистре, которые можно использовать, чтобы знать, где разделить.   -  person Casimir et Hippolyte    schedule 27.03.2016
comment
Идеальный chris85. Спасибо. Очень признателен.   -  person IMG Imports Inc.    schedule 27.03.2016


Ответы (1)


Вы можете использовать (*SKIP)(*FAIL), чтобы указать регулярному выражению не совпадать, если предыдущее совпадение совпадает. Так

(in|o\.c)\.\h+(*SKIP)(*FAIL)|(?<=[.?!])\s+

Сообщает регулярному выражению, что оно не совпадает, если совпадает in. или o.c.. В противном случае разделите на ., ! или ? и пробел.

Демонстрация PHP: https://eval.in/542856
Демонстрация Regex101: https://regex101.com/r/eS0tR7/1

person chris85    schedule 27.03.2016