fork(3) download
  1. <?php
  2. /*«Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:
  3.  
  4. нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия
  5. «жи» или «ши» написано с буквой ы
  6. в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
  7. в тексте есть слова «а» или «но» без запятой перед ними.
  8. (можешь добавить еще несколько правил, если хорошо знаешь русский язык)
  9.  
  10. В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).*/
  11.  
  12.  
  13. $coolStory = <<<EOF
  14. Нас было 100 а он 1
  15. сдесь нечего делать
  16. сдесь никого нет
  17. этажы
  18. EOF
  19. ;
  20. $regExp = "/(координально)|(сдесь)|(здела[лнюеть]{1,2})|([а-яё]{1}\\s+а\\s+)|([а-яё]{1}\\s+но\\s+)|([,\\.!\\?:;][^\\s])|(\\s?[а-яё]*(жы|шы)[а-яё]*[\\s\\.,?!:;]+)/iUu";
  21. /*
  22. $possibleErrors = array (
  23. 1 => array ( "pattern" => "/координально/ui",
  24. "message" => "- Ошибка в слове \"кардинально\"."
  25. ),
  26. 2 => array ( "pattern" => "/сдесь/ui",
  27. "message" => "- Не \"сдесь\", а \"здесь\"."
  28. ),
  29. 3 => array ( "pattern" => "/здела[лнюет]{1,2}/ui",
  30. "message" => "- Приставки \"з\" нет в русском языке."
  31. ),
  32. 4 => array ( "pattern" => "/\\s+а\\s+/ui" ,
  33. "message" => "- Пропущена запятая перед союзом \"а\"."
  34. ),
  35. 5 => array ( "pattern" => "/\\s+но\\s+/ui",
  36. "message" => "- Пропущена запятая перед союзом \"но\"."
  37. ),
  38. 6 => array ( "pattern" => "/[,\\.!\\?:;][^\\s]/ui",
  39. "message" => "- Пропущен пробел после знака препинания."
  40. ),
  41. 7 => array ( "pattern" => "/\\s?[а-яё]*(жы|шы)[а-яё]*[\\s\\.,?!:;]+/" ,
  42. "message" => "- \"Жи-Ши\" пиши с \"и\"!"
  43. ),
  44.  
  45. ); */
  46. $possibleErrors = array(
  47. "/координально/uUi" => " - Ошибка в слове \"кардинально\".",
  48. "/сдесь/uUi" => " - Не \"сдесь\", а \"здесь\".",
  49. "/здела[лнюеть]{1,2}/uUi" => " - Приставки \"з\" нет в русском языке.",
  50. "/[а-яё]{1}\\s+а\\s+/uUi" => " - Пропущена запятая перед союзом \"а\".",
  51. "/[а-яё]{1}\\s+но\\s+/uUi" => " - Пропущена запятая перед союзом \"но\".",
  52. "/\\s?[а-яё]*(жы|шы)[а-яё]*[\\s\\.,?!:;]+/uUi" => " \"- Жи-Ши\" пиши с \"и\"!",
  53. "/[,\\.!\\?:;][^\\s]/uUi" => " - Пропущен пробел после знака препинания."
  54. );
  55. echo $coolStory . "\n\n";
  56. $errs = array();
  57. preg_match_all($regExp, $coolStory, $errs);
  58. $matches = $errs[0];
  59. $notices = array();
  60.  
  61. for ($i = 0; $i < count($matches); $i++) {
  62. foreach ($possibleErrors as $pattern => $message) {
  63. if (preg_match($pattern, $matches[$i])) {
  64. $notices[$i] = $message;
  65. }
  66. }
  67.  
  68. }
  69. $i = 0;
  70.  
  71. foreach ($matches as $value) {
  72. $position = (mb_strpos($coolStory, $value) < 20) ? 0 : mb_strpos($coolStory, $value) - 20;
  73.  
  74. $length = ($position == 0) ? mb_strpos($coolStory, $value) : 20;
  75.  
  76. $contextPrev = mb_substr($coolStory, $position, $length);
  77. $errNo = $i + 1;
  78. $contextFollow = mb_substr($coolStory, $position + $length + mb_strlen($value), 30);
  79. echo "Ошибка" . $errNo . ":\"...";
  80. echo $contextPrev . $value . "$contextFollow...\"";
  81. echo $notices[$i] . "\n";
  82. $i++;
  83. }
  84.  
  85. /*var_dump($errs); */
  86.  
  87.  
  88.  
  89. ?>
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
Нас было 100 а он 1
сдесь нечего делать
сдесь никого нет
этажы

Ошибка1:"...Нас было 100 а он 1
сдесь нечего делать
сдесь никого не..." -  Не "сдесь", а "здесь".
Ошибка2:"...Нас было 100 а он 1
сдесь нечего делать
сдесь никого не..." -  Не "сдесь", а "здесь".