<?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="много их в Петербурге?молоденьких дур,сегодня в атласе да бархате,а завтра , поглядишь , метут улицу вместе с голью кабацкою...в самом деле ,что было бы с нами ,если бы вместо общеудобного правила:чин чина почитай , ввелось в употребление другое,например:ум ума почитай?какие возникли бы споры!";
// $text = 'привет.есть 2 функции,preg_split и explode ,не понимаю,в чем между ними разница.';

/* Делает первую букву в строке заглавной */
function makeFirstLetterUppercase($text) {
    // $reg='/^[а-яёa-z]/u';
    // $match=preg_match_all($reg,$text,$match);
    // var_dump($match[0]);
    // $text=preg_replace($reg,mb_strtoupper($match[0]),$text);
    $firstLetter=mb_strtoupper(mb_substr($text,0,1));
    $text=$firstLetter.mb_substr($text,1);
    return $text;
    
}
$text=makeFirstLetterUppercase($text);

function fixText($text) {

   $regSpacesAfter='/([.,:?;!])\\s*()/u';
   $text=preg_replace($regSpacesAfter,"$1 $2",$text);
   $mat=[];
   $regSpacesBefore='/()\\s+([.,:?;!])/u';
   preg_match_all($regSpacesBefore,$text,$mat,PREG_SET_ORDER);
   $count=count($mat);
     for($i=0;$i<$count;$i++){
   	 preg_match_all($regSpacesBefore,$text,$mat,PREG_SET_ORDER);
   	 $text=preg_replace($regSpacesBefore,$mat[0][2],$text, 1);
   	 
   }
  
   
   $regToUpper='/[?!.]\\s([а-яёa-z])/u';
   $match=[];
   preg_match_all($regToUpper,$text,$match,PREG_SET_ORDER);
   $countMatch=count($match);
   for($i=0;$i<$countMatch;$i++){
   preg_match_all($regToUpper,$text,$match,PREG_SET_ORDER);
   $text=preg_replace($regToUpper,mb_strtoupper($match[0][0]),$text,1);
   
   }
   return $text;
}

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