<?php

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

$text = "Такая,знаете ли,мура получается с этим программированием но поначалу всё вроде шло хорошо!Даже замечательно! Но ведь в какой-то момент всегда начинаются проблемы, вы понимаете?А в этот раз они начались тогда,когда дошёл сначала до массивов;затем было сложно с циклами и массивами управляться сразу,но вполне ещё терпимо; потом вроде бы разобрался а думаете - это легко для гуманитария? Для гуманитария, может быть, и легко но для меня - нет. Мне как-то проще траллить технарей,чем стать на их уровень в программировании. У меня шырокий кругозор и шикарная жызненная позиция:непротивление насилию злом,но это, как ни странно, не помогает освоить программирование. Всё это весьма удручает,а также выбивает из колеи. А выбитый из колеи гуманитарий способен затралить любого,даже уравновешенного технаря-программиста на языке PHP. Это координально меняет ситуацию, описанную сдесь. Если же я зделаю всё так, как должно быть зделано, то все останутся целы.";
$bigRegexp = "/координально|сдесь|[^а-яё]здела[лнoюет]{1,2}|[а-яёa-z]\\sа(\\s?|,|...| \\-)|[а-яёa-z]\\sно(\\s?|,|...| \\-)|[,\\.!\\?:;][^\\s]|(ж|ш)ы/ui";
$possibleErrors = array (
	                 0 => array ( "pattern" => "/.{3,5}координально.{3,5}/ui",        
	                 	         "message" => "- Ошибка в слове \"кардинально\"."
	                 	        ),
	                 1 => array ( "pattern" => "/.{3,5}сдесь.{3,5}/ui",
	                              "message" => "- Не \"сдесь\", а \"здесь\"."
	                            ),
	                 2 => array ( "pattern" => "/.{3,5}[^а-яё]здела[лнoюет]{1,2}.{3,5}/ui", 
	                              "message" => "- Приставки \"з\" нет в русском языке."
	                            ),   
	                 3 => array ( "pattern" => "/.{3,5}[а-яёa-z]\\sа(\\s?|,|...| \\-).{3,5}/u", 
	                              "message" => "- Пропущена запятая перед союзом \"а\"."
	                            ),
	                 4 => array ( "pattern" => "/.{3,5}[а-яёa-z]\\sно(\\s?|,|...| \\-).{3,5}/u", 
	                             "message" => "- Пропущена запятая перед союзом \"но\"."
	                            ),   
	                 5 => array ( "pattern" => "/.{3,5}[,\\.!\\?:;][^\\s].{3,5}/ui",
	                             "message" => "- Пропущен пробел после знака препинания."
	                            ),       
	                 6 => array ( "pattern" => "/.{3,5}(ж|ш)ы.{3,5}/ui" , 
	                             "message" => "- \"Жи-Ши\" пиши с \"и\"!"
	                            )
 	               );
$regexpClean = array(
	            '/\\,/'            => ', ',
                '/\\;/'            => '; ',
                '/\\!/'            => '! ',
                '/\\?/'            => '? ',
                '/\\:/'            => ': ',
                '/жы/ui'           => 'жи',
                '/шы/ui'           => 'ши',
                '/координально/ui' => 'кардинально', 
                '/сдесь/ui'        => 'здесь', 
                '/зделал/ui'       => 'сделал', 
                '/зделаю/ui'       => 'сделаю',
                '/зделано/ui'      => 'сделано', 
                '/зделать/ui'      => 'сделать',
                '/ а /u'           => ', а ',
                '/ а, /u'          => ', а, ',
                '/ а \\-/u'        => ', а \\-',
                '/ а\\.\\.\\./u'   => ', а...',
                '/ но /u'          => ', но ',
                '/ но, /u'         => ', но, ',
                '/ но \\-/u'       => ', но \\-',
                '/ но\\.\\.\\./u'  => ', но...',
                '/,\\s?,/u'        => ',',
                '/;,/u'            => ';',
                '/:,/u'            => ':',
                '/\\s\\s/ui'       => ' '
                );
$possibleErrorsCount = count($possibleErrors); /*Считаем количество регулярных выражений в массиве*/

if (preg_match_all($bigRegexp, $text, $allMatches)) {

    foreach ($possibleErrors as $cleanArrays => $patternsAndMessages) { /*Цикл для поиска ошибок с помощью отдельных регулярок (ключей) в массиве и вывода соответствующих регуляркам правил (значений в массиве)*/
    
	    if (preg_match_all($patternsAndMessages['pattern'], $text, $matches)) { /*Достаём из массива регулярку, подставляем её в функцию, проверяем найденные ошибки в тексте $text на соответствие*/
		    $message = $patternsAndMessages['message']; /*Выводим соответствующее правило из массива (содержание), чтобы вывести его затем в echo*/
            $cleanMatches = $matches[0]; /*Упрощаем получившийся массив с ошибками для возможности последующего вывода ошибок*/
        
            foreach ($cleanMatches as $key => $value) { /*Цикл для извлечения ошибок из массива и вывода их в echo*/
                echo "\nНайденная ошибка:\n";
                echo "...{$value}... {$message}\n";
            }
  	    } 
    }
} else {
  		echo "Ошибок в тексте не найдено.\n";
  		echo "\nОригинальный текст:\n{$text}\n";
  }

if (preg_match_all($bigRegexp, $text)) { 
    foreach ($regexpClean as $regexp => $correct) {/*Цикл для преобразования массива с отдельными регулярками в ключи и значения*/
  	    $text = preg_replace($regexp, $correct, $text); /*Переменная с текстом, в котором с помощью preg_replace подставляются отдельные регулярки и соответствующие им заменяемые варианты правильного текста; в итоге переменная меняется при прохождении цикла, поэтому итоговый вывод исправленного текста мы делаем за пределами этого цикла*/
    }
    echo "\nИсправленный текст:\n{$text}\n";
}

?>