<?php

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

$coolStory = "Такая,знаете ли,мура получается,а с этим программированием;поначалу всё вроде шло хорошо!Даже замечательно! Но ведь в какой-то момент всегда начинаются проблемы, вы понимаете?А в этот раз они начались тогда,когда дошёл сначала до массивов;затем было сложно с циклами и массивами управляться сразу,но вполне ещё терпимо; потом вроде бы разобрался. Думаете -это легко для гуманитария? Для гуманитария, может быть, и легко, а для меня - нет. Мне как-то проще траллить технарей,чем стать на их уровень в программировании. У меня шырокий кругозор и шикарная жызненная позиция:непротивление насилию злом,но это, как ни странно, не помогает освоить программирование. Всё это весьма удручает,а также выбивает из колеи. А выбитый из колеи гуманитарий способен затралить любого,даже уравновешенного технаря-программиста на языке PHP. Это координально меняет ситуацию, описанную сдесь. Если же я зделаю всё так, как должно быть зделано, то все останутся целы.";

$regExp = '/координально|сдесь|здела[лноюет]{1,2}|\\s+а\\s+|\\s+но\\s+|[,\\.!\\?:;][^\\s]|(ж|ш)ы/iu'; 

$possibleErrors = array (
	                 0 => array ( "pattern" => "/координально/ui",        
	                 	         "message" => "- Ошибка в слове \"кардинально\"."
	                 	        ),
	                 1 => array ( "pattern" => "/сдесь/ui",
	                              "message" => "- Не \"сдесь\", а \"здесь\"."
	                            ),
	                 2 => array ( "pattern" => "/здела[лнoюет]{1,2}/ui", 
	                              "message" => "- Приставки \"з\" нет в русском языке."
	                            ),   
	                 3 => array ( "pattern" => "/[^а-яё\\s]а\\s/ui" , 
	                              "message" => "- Пропущен пробел перед союзом \"а\"."
	                            ),
	                 4 => array ( "pattern" => "/[^а-яё\\s]но\\s/ui", 
	                             "message" => "- Пропущен пробел перед союзом \"но\"."
	                            ),   
	                 5 => array ( "pattern" => "/[,\\.!\\?:;][^\\s(а|но)]/ui",
	                             "message" => "- Пропущен пробел после знака препинания."
	                            ),       
	                 6 => array ( "pattern" => "/(ж|ш)ы/ui" , 
	                             "message" => "- \"Жи-Ши\" пиши с \"и\"!"
	                            )
 	               );

$errors = array(); /*Пустой массив, в который собираются ошибки*/

preg_match_all($regExp, $coolStory, $errors);	/*С помощью функции вытаскиваем регуляркой из текста все ошибки и заполняем ими массив $errs*/

$matches = $errors[0]; /*Определяем переменную для всех ошибок, вытащенных предыдущей функцией*/

$number = count($matches); /*Считаем количество ошибок в тексте*/

//var_dump($matches);

for ($i=0; $i < $number; $i++) { /*Цикл для поиска ошибок с помощью отдельных регулярок (ключей) в массиве и вывода соответствующих регуляркам правил (значений в массиве)*/

     		foreach ($possibleErrors as $value) {

    		    $pattern = $value['pattern']; 
    		    $message = $value['message'];
    		 	
    		 	if(preg_match($pattern, $matches[$i])) {
    		 		//var_dump($pattern);
    			    
    			    $startOfTheString = preg_match($pattern, $coolStory);
    			    $wrongText = mb_substr($coolStory, $startOfTheString, 30);
    		            $num = $i + 1;
    		            echo "{$num} {$message} Часть текста с ошибкой: ...{$wrongText}...\n";
    		 	}
    	 	}
}
//}
//var_dump($pattern);
//var_dump($message);
?>
