<?php
/*«Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:

нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия
«жи» или «ши» написано с буквой ы
в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
в тексте есть слова «а» или «но» без запятой перед ними.
(можешь добавить еще несколько правил, если хорошо знаешь русский язык)

В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).*/

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

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

); */
$possibleErrors = array(
    "/координально/uUi" => " - Ошибка в слове \"кардинально\".",
    "/сдесь/uUi" => " -  Не \"сдесь\", а \"здесь\".",
    "/здела[лнюеть]{1,2}/uUi" => " - Приставки \"з\" нет в русском языке.",
    "/[а-яё]{1}\\s+а\\s+/uUi" => " - Пропущена запятая перед союзом \"а\".",
    "/[а-яё]{1}\\s+но\\s+/uUi" => " - Пропущена запятая перед союзом \"но\".",
    "/\\s?[а-яё]*(жы|шы)[а-яё]*[\\s\\.,?!:;]+/uUi" => " \"- Жи-Ши\" пиши с \"и\"!",
    "/[,\\.!\\?:;][^\\s]/uUi" => " - Пропущен пробел после знака препинания."
);
echo $coolStory . "\n\n";
$errs = array();
preg_match_all($regExp, $coolStory, $errs);
$matches = $errs[0];
$notices = array();

for ($i = 0; $i < count($matches); $i++) {
    foreach ($possibleErrors as $pattern => $message) {
        if (preg_match($pattern, $matches[$i])) {
            $notices[$i] = $message;
        }
    }
    
}
$i = 0;

foreach ($matches as $value) {
    $position = (mb_strpos($coolStory, $value) < 20) ? 0 : mb_strpos($coolStory, $value) - 20;
    
    $length = ($position == 0) ? mb_strpos($coolStory, $value) : 20;
    
    $contextPrev   = mb_substr($coolStory, $position, $length);
    $errNo         = $i + 1;
    $contextFollow = mb_substr($coolStory, $position + $length + mb_strlen($value), 30);
    echo "Ошибка" . $errNo . ":\"...";
    echo $contextPrev . $value . "$contextFollow...\"";
    echo $notices[$i] . "\n";
    $i++;
}

/*var_dump($errs); */



?>