<?php

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

// Работает:
//$text = "ny , chto...    ne smotrel eshe black mesa..ya sob.";
//$text = "roses are red,and violets are blue.whatever you do i'll keep it for you.";

// Не работает:
//$text = 'привет.есть 2 функции,preg_split и explode ,не понимаю,в чем между ними разница.';
//$text = "ну  , что...      не смотрел еще black mesa.я собирался скачать  ,но все как-то некогда было.";


function makeFirstLetterUppercase($text) {
	// После этой операции если кириллица, то у $text[0] слетает кодировка.
    return mb_strtoupper($text[0]) . mb_substr($text, 1);
}

function fixText($text) {

    $fixedSentences = [];
    // Разбивка текста на предложения. Обрезает до первого знания препинания, не включая ','.
    // Если знаков несколько - остальные летят в массив следом, отдельно.
    $sentences = preg_split('/(?<=[!.?])/ui', $text, -1, PREG_SPLIT_NO_EMPTY);
    
    foreach ($sentences as $sentence) {
        // Фикс знаков '.!?'. Склейка с предыдущим. предложением.
        if (in_array($sentence, ['.', '!', '?'])) {
            $sentence = array_pop($fixedSentences) . $sentence;
        }
        // Фикс запятой, верхний регистр первой буквы в предложении.
        $sentenceParts = array_map('trim', explode(',', $sentence));
        $sentence = makeFirstLetterUppercase(implode(', ', $sentenceParts));
        
        $fixedSentences[] = $sentence;
    }
    
    return implode(' ', $fixedSentences);
}

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