<?php
mb_internal_encoding('utf-8');

// Текст: 
$text = <<<EOF
нет пробела после запятой,точки с запятой;восклицательного знака!вопросительного знака?двоеточия:
«жы» или «шы» написано с буквой ы,
в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
в тексте есть слова а или но без запятой перед ними.
EOF
;

// Массив патернов поиска и описаний ошибок
$regexpArray = array(
        '/(\\S+)(,|;|!|[?]|:)(\\S+)/u' => 'нет обязательного пробела после «.,!?;:»',
        '/(\\S*)([ ]*)(\\S*)(ж|ш)ы(\\S*)([ ]*)(\\S*)/u' => '«жи» или «ши» написано с буквой ы',
        '/(координально)/u' => 'орфографические ошибки в словах',
        '/(сдесь)/u' => 'орфографическая ошибка №1 в слове',
        '/(зделал)/u' => 'орфографическая ошибка №2 в слове',
        '/(зделаю)/u' => 'орфографическая ошибка №3 в слове',
        '/(зделан)/u' => 'орфографическая ошибка №4 в слове',
        '/(\\S*)([^,])([ ])(но|а)(\\s)/u' => 'союзы А или НО без запятой перед ними'
        );

// Массив замены
$replacement = array(
        '$1$2 $3',
        '$1$2$3$4и$5$6$7',
        'кардинально', 'здесь', 'сделал', 'сделаю', 'сделан',
        '$1$2,$3$4$5'        
        );

// Выводим кусок текста с ошибкой
function findMistake ($regexpArray, $text) {
    
    foreach ($regexpArray as $regexp => $descriotion) {       
    
        if (preg_match_all($regexp, $text, $result, PREG_SET_ORDER)) {
            
            echo "\nОшибка: {$descriotion}\n";
            
            foreach ($result as $e) {
                echo "*{$e[0]}*\n";
            }   
        }
    }
}
findMistake ($regexpArray, $text);

// Исправляем ошибки в тексте
$text = preg_replace (array_flip($regexpArray), $replacement, $text);
echo "\nИсправленный текст:\n{$text}";

?>
