<?php

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

$text1 = "ну   что.      не смотрел еще     black mesa?я собирался     скачать  ,но все как-то некогда было!";
$text2 = " roses are  red,and violets  are blue.whatever you do   I'll keep it for you.";
$text3 = "привет.есть 2 функции,preg_split и explode ,не понимаю,в чем между ними разница.";
$text4 = "много их в Петербурге,молоденьких дур,сегодня в атласе да бархате,а завтра , поглядишь , метут улицу вместе с 
голью кабацкою...в самом деле ,что было бы с нами ,если бы вместо общеудобного правила:чин чина почитай , ввелось в 
употребление другое,например:ум ума   почитай?какие возникли  бы споры!";

/**
 * @param array<string> $text
 */
function makeFirstCharUpperCase(array $text): string
{
    $result = '';
    foreach ($text as $string) {
        $string = trim($string);
        $upperChar = mb_strtoupper(mb_substr($string, 0, 1));
        $result .= $upperChar . mb_substr($string, 1);
    }
    return $result;
}

function fixText(string $text): ?string
{
    $text = preg_split('/(?<=[.!?])(?=[\w\s])/u', $text, -1, PREG_SPLIT_NO_EMPTY);
    $sentences = makeFirstCharUpperCase($text); /** @phpstan-ignore-line  */
    return preg_replace(
        ['/\s\s+/', '/\s([.,:;!?])/', '/([.,:;!?])(\w)/u'],
        [' ', '$1', '$1 $2'],
        $sentences
    );
}

echo fixText($text1) . "<br>";
echo fixText($text2) . "<br>";
echo fixText($text3) . "<br>";
echo fixText($text4) . "<br>";
