<?php

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

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



/* Делает первую букву в строке заглавной */
function makeFirstLetterUppercase($text)
{
    // Разбиваем текст на предложения
    $explode    = preg_split("/[.?!]/u", $text, 0, PREG_SPLIT_NO_EMPTY);
    $characters = array();
    foreach ($explode as $suggestions) {
        $i              = $i + 1;
        // Удаляем пробелы из начала строки
        $suggestions    = trim($suggestions);
        // Разбиваем текст на буквы (у каждого предложения свой массив)
        $characters[$i] = preg_split('//u', $suggestions, 0, PREG_SPLIT_NO_EMPTY);
        foreach ($characters[$i] as $letters) {
            // В каждом массиве изменяем регистр первого элемента массива (букву)
            $characters[$i][0] = mb_strtoupper($characters[$i][0]);
        }
        // Собираем буквы в предложения
        $comma_separated = implode("", $characters[$i]);
        // Собираем предложения в текст и возвращаем точки
        $edit            = $edit . "{$comma_separated}.";
        $text            = $edit;
    }
    
    $result = fixText($text);
    return ($result);
}

/* исправляет текст */
function fixText($text)
{
    // Удаляем лишние пробелы перед !?,.
    $text = preg_replace('/([a-zа-яё]+)([\\s]+)([!?,.]+)/ui', '$1$3', $text);
    // Добавляем пробел после !?,.
    $text = preg_replace('/([?!.,]+)([a-zа-яё]+)/ui', '$1 $2', $text);
    return ($text);
}

$result = makeFirstLetterUppercase($text);
echo "{$result}\n";