<?php

error_reporting(-1);

$text = <<<EOF
Падали листья,осень пришла. Список: один;два; Наступала зима!Пара кутаться в шарф?Друг ответил:нет! Всплыла шырокая улыбка. Жыви и радуйся теплу! Нам нужно координально поменять жизнь. Сдесь что-то не так. Зделал проект или зделаешь завтра? Давно уже зделан. Второй проект а не первый! Будет сделан но завтра не обещаю!
EOF
;

$foundErrors = [];
$errorWithContext = ''; // Шаблон для поиска ошибки с контектом
$startEndError = ['@^/@', '@/u@']; // Начало и конец шаблона для поиска ошибки
$leftAndRightContext = ['/\w+\.?\s?', '\.?\s?\w+/u']; // Контекст ошибки

$grammarErrors = [
			//шаблон для поиска ошибки, замена, описание ошибки
			['/(\w)(,|;|!|:|\?)(\w)/ui', '$1$2 $3', 'Нет пробела после знака препинания:'],
			['/(ж|ш)(ы)/ui', '$1и', 'Жи Ши с буквой И:'],
			['/координально/ui', 'кардинально', 'Правильно - кардинально:'],
			['/Сдесь/u', 'Здесь', 'Правильно - здесь:'], // вариант с большой буквой указываем первым и отдельно
			['/сдесь/ui', 'здесь', 'Правильно - здесь:'],
			['/З(дел)(ал|аешь|ан)/u', 'С$1$2', 'Сделать с буквой С:'], // вариант с большой буквой указываем первым и отдельно
			['/з(дел)(ал|аешь|ан)/ui', 'с$1$2', 'Сделать с буквой С:'],
			['/(\w)\s(а|но)/ui', '$1, $2', 'Перед А и НО запятая:'],

];

echo "{$text}\n\n";

foreach ($grammarErrors as $rule) {

	$errorWithContext = preg_replace($startEndError, $leftAndRightContext, $rule[0]);

	preg_match_all($errorWithContext, $text, $foundErrors);

	if(!empty($foundErrors[0])) {
		
		echo "{$rule[2]}\n";

		foreach ($foundErrors[0] as $error) {
			echo "\t{$error}\n";
		}

		$text = preg_replace($rule[0], $rule[1], $text);
	}
}

echo "\n{$text}\n";