fork download
  1. <?php
  2. //"Grammar Nazi" с функцией-обёрткой
  3.  
  4. function fixGrammar($regexp, $callback, $text){
  5. $text = preg_replace_callback($regexp, $callback, $text);
  6. return $text;
  7. }
  8.  
  9. function copyCase($neededLetter, $symbol){
  10. if (preg_match('/[А-ЯЁ]/u', $symbol)){
  11. return mb_strtoupper($neededLetter);
  12. }
  13. return $neededLetter;
  14. }
  15.  
  16. $text = "ЗДЕЛАЛ СДЕСЬ КООРДИНАЛЬНО Привет,Жырный!труд:Шырокий?пассаЖЫР;зделаю Координально но, например СДЕСЬ сдесь решена проблема ушыбов.
  17. ЗДЕЛАНО многое а? ведь эти ушы зделали мы. Один ананас но зато как ЗДЕЛАННЫЙ";
  18.  
  19. $simpleReplace = ['/(к)оординально/ui' => '$1ардинально', //кардинально
  20. '/([,;!?:])([^,;!?:\\s]+)/u' => '$1 $2', //пробелы после знаков препинания
  21. '/([а-яё]+)\\s+((?:а|но)\\b)/ui' => '$1, $2']; //знаки препинания
  22.  
  23. foreach ($simpleReplace as $pattern => $replacement){
  24. $text = preg_replace($pattern, $replacement, $text);
  25. }
  26.  
  27. $text = fixGrammar('/(с)(десь)/ui',
  28. function($matches){
  29. $letter = copyCase('з', $matches[1]);
  30. $word = "{$letter}{$matches[2]}";
  31. return $word;
  32. }, $text);
  33.  
  34. $text = fixGrammar('/(з)(дела)((?:ю|л|н)\\s*)/ui',
  35. function ($matches){
  36. $letter = copyCase('с', $matches[1]);
  37. $word = "{$letter}{$matches[2]}{$matches[3]}";
  38. return $word;
  39. }, $text);
  40.  
  41. $text = fixGrammar('/([а-яё]*(?:ж|ш))(ы)([а-яё]*)/ui',
  42. function ($matches){
  43. $letter = copyCase('и', $matches[2]);
  44. $word = "{$matches[1]}{$letter}{$matches[3]}";
  45. return $word;
  46. }, $text);
  47.  
  48. echo $text;
  49. ?>
Success #stdin #stdout 0.02s 52480KB
stdin
Standard input is empty
stdout
СДЕЛАЛ ЗДЕСЬ Кардинально Привет, Жирный! труд: Широкий? пассаЖИР; сделаю Кардинально, но, например ЗДЕСЬ здесь решена проблема ушибов.
		СДЕЛАНО многое, а? ведь эти уши сделали мы. Один ананас, но зато как СДЕЛАННЫЙ