Тестировал ваш код на большом кол-ве предложений.
Работает стабильно, особенно если выкинуть вот этот участок, отвечающий за сокращения.
Код:
if (preg_match('/(?<=[^.]\.)\G(?!\.)/', $text, $w, 0, $i) && in_array($m[1][0], $sokr)) {
$s=true;
} else {
$s=false;
}
Если не выкинуть этот участок, то php случайным образом вылетает, закономерность на тексте не удалось определить.
Теперь планирую получившие предложения еще раз прогнать скриптом, чтобы их склеить, если на концах предложения встречаются сокращения и по возможности обработать конструкции вида: Фамилия И.О. и И. О. Фамилия.
Такие вещи разбиваются как разные предложения.
Спасибо за ваш скрипт, даже с учетом мелких замечаний, класнный.
Кстати если кто будет разбивать текст в юникоде, не забудте в регулярках дописать модификатор "u".
Не могли бы вы разъяснить смысл вот этого регулярного выражения
Код:
preg_match('/(?<=[^.]\.)\G(?!\.)/', $text, $w, 0, $i)
он вроде бы отвечает за выделение на конце предложения сокращения, как думаете его можно заменить вот таким выражением:
Код:
preg_match('/\s([а-яё]+)\.$/ui', $txt, $m, PREG_OFFSET_CAPTURE)