<?php

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

$text = "Такая,знаете ли,мура получается с этим программированием но поначалу всё вроде шло хорошо!Даже замечательно! Но ведь в какой-то момент всегда начинаются проблемы, вы понимаете?А в этот раз они начались тогда,когда дошёл сначала до массивов;затем было сложно с циклами и массивами управляться сразу,но вполне ещё терпимо; потом вроде бы разобрался а думаете - это легко для гуманитария? Для гуманитария, может быть, и легко но для меня - нет. Мне как-то проще траллить технарей,чем стать на их уровень в программировании. У меня шырокий кругозор и шикарная жызненная позиция:непротивление насилию злом,но это, как ни странно, не помогает освоить программирование. Всё это весьма удручает,а также выбивает из колеи. А выбитый из колеи гуманитарий способен затралить любого,даже уравновешенного технаря-программиста на языке PHP. Это координально меняет ситуацию, описанную сдесь. Если же я зделаю всё так, как должно быть зделано, то все останутся целы.";
$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); /*Считаем количество регулярных выражений в массиве*/

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 "Ошибок в тексте не найдено.";
  		break;
  	}
}
 
foreach ($regexpClean as $regexp => $correct) {/*Цикл для преобразования массива с отдельными регулярками в ключи и значения*/
  	$text = preg_replace($regexp, $correct, $text); /*Переменная с текстом, в котором с помощью preg_replace подставляются отдельные регулярки и соответствующие им заменяемые варианты правильного текста; в итоге переменная меняется при прохождении цикла, поэтому итоговый вывод исправленного текста мы делаем за пределами этого цикла*/
}
    echo "\nТекст без ошибок:\n{$text}\n";

?>
