<?php

error_reporting(-1);
mb_internal_encoding('utf-8');

$text = "ну что.      не смотрел еще black mesa.    я собирался скачать  ,но все как-то некогда было.
что скажешь про portal 2 ? я вот не играл в него еще ! очень длинный кусок текста получился со своими вставками , надо бы его разбить !
Всё равно не влазит? Нет проблем, сделаем так что бы наш скрипт эту хуйню тоже исправлял.";
// Для тестов
//$text = "roses are red,and violets are blue.whatever you do i'll keep it for you.";
//$text = 'привет.есть 2 функции,preg_split и explode ,не понимаю,в чем между ними разница.';


function healText($text) {

	$splitter = '/[\s\wа-яё,\'-]+[.?!]/ui';
	$sentences = [];
	//бьем на предложения сохраняя в конце знак припинания
	$numberOfsentences = preg_match_all($splitter, $text, $sentences);
	//массив предложений лежал в 0 элементе исходного, забираем его.
    $sentences = $sentences[0]; 
    
	foreach ($sentences as &$sentence) {
		$sentence = preg_replace('/\s{2,}/', ' ', $sentence); //если больше 2 пробелов подряд то оставляем только 1
		$sentence = trim($sentence); // убирает пробелы в начале и конце и переходы на след строку.
		$sentence = preg_replace('/\s?,\s?/', ', ', $sentence); //убираем неправельные пробелы вокруг запятых
		$sentence = preg_replace('/\s?[?]\s?/', '?', $sentence); // вокруг вопросов
		$sentence = preg_replace('/\s?[!]\s?/', '!', $sentence); // вокруг !
		$sentence = preg_replace('/\s?[.]\s?/', '.', $sentence); // вокруг точек
		$sentence = call_user_func('makeFirstLetterBig', $sentence);  //делает первую букву заглавной.
	}
	$result = implode(' ', $sentences);
	return $result;
}

function makeFirstLetterBig ($string) {
	$firstLetter = mb_strtoupper(mb_substr($string, 0, 1)); //Первая буква
	$otherLetters = mb_substr($string, 1); //остальная часть строки
	$headedString = $firstLetter . $otherLetters; //склеиваем
	return $headedString;	
}

$test = healText($text);
echo $test;
